首页 > 代码库 > 4_Shell语言———脚本概述

4_Shell语言———脚本概述

一、初识脚本


简单说,脚本就是数条可执行语句的罗列。例如我们将以下可执行命令粘贴至first.sh 这个文件中:

UserName=user1
mkdir /users
useradd -d /users/$UserName $UserName
echo $UserName | passwd --stdin $UserName

这样first.sh就是一个脚本,sh用来标注这是一个shell脚本,它能够使用以下命令执行:

# bash first.sh

wKiom1NiWFKjmTUJAAPn5COBg3U527.jpg



二、脚本的执行

上面的例子中我们使用了bash命令来执行 first.sh文件,事实上first.sh是个可执行文件,那么就意为着它可以自我执行而不需要使用bash命令。但是当我们给first.sh加上执行权限,输入 first.sh后提示该命令不存在,这是由于所有在终端中可以直接执行的命令,是能在环境变量中定义过的路径下查找到的,first.sh并没有定义在环境变量中,因此无法直接执行。

# chmod +x first.sh

# first.sh

# echo $PATH

# /root/first.sh        //给该文件指定路径,则有可能可以执行

wKioL1NiWHGRl68SAAHe8r3Z6mE040.jpg

之所以说该文件“有可能”可以执行,是因为有时候若不指定具体的解释器,它将无法确定用什么解释器,从而导致无法执行。所以通常情况下在编写脚本时,第一行会用来指定执行该脚本的解释器,增加的这一行在脚本语言中称为 shebang,目的为告诉内核是否可以执行下面的内容,其格式为:


#!解释器程序路径

如在first.sh中首行处增加一行:

#!/bin/bash

wKiom1NiWPmzjHHfAAIChni2Vn4589.jpg



   事实上,几乎每一个可执行程序的初始位置都有一个 magic number(魔数),用来标识本程序的格式。Linux上编译的程序无法在Windows上执行,是因为ABIApplication Binary Interface:应用程序二进制接口)不兼容。通常在Linux上编译的程序采用的是ELF格式,例如我们可以使用file命令来查看一个可执行命令:

       # file /bin/ls

wKiom1NiWSSjnITYAACZe-aadWc546.jpg

  这种格式在Windows上可能无法识别。要鉴别一个文件是否可识别,靠的就是magic number。上述例子中shebang的作用就是告知当前内核,此脚本的magic number是什么,能不能执行。


Linux中的ls命令可以被内核直接执行,是因为它为内核提供了执行入口。执行入口是告诉计算机从什么地方开始执行,比如javac语言中,main函数就是执行入口;上述first.sh中, #!/bin/bash 也是执行入口。执行入口所在的函数为主函数,所在的程序是主程序。


三、语言的控制流程


1. 什么是语言的控制流程

还是以first.sh为例,如果我们想同时建立几个用户,可以采用一个笨办法,即将first.sh中现有内容复制几遍,如:

#!/bin/bash
UserName=user4
mkdir /users
useradd -d /users/$UserName $UserName
echo $UserName | passwd --stdin $UserName
UserName=user5
mkdir /users
useradd -d /users/$UserName $UserName
echo $UserName | passwd --stdin $UserName


   但多次复制相同的代码并无太大意义,且造成了代码的冗余,因此可以引入一个机制,让某一段代码执行多次,每次执行只改变变量的值即可,这就是循环语句。这种控制代码执行方式的机制,就是语言的控制流程。


2.语言控制结构

编程语言主要有两类,一种是面向过程的编程语言,一种是面向对象的编程语言。前者关注的是解决问题的步骤,后者则是将解决问题的方法封装抽象到类中。在面向过程的编程语言中,语言控制结构主要有以下三种:

a)顺序执行:一句一句逐行执行;

b)选择执行:有多条语句,但不全部执行,而是根据条件有选择的执行;

c)循环执行:将某些语句来回执行多次。上述脚本first.sh中如果不采用将部分代码简单复制多次,而是只改变 $UserName 的值来执行多次的方式,就是循环执行。


注:本文是对脚本和语言控制流程的概述,后续文章将对脚本和语言控制流程进行更系统详细的介绍


本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1405411