bash编程

           

 

看一个简单的例子,写一个Hello world

wKiom1PeKzjiInZ5AAAIrKQZq2E604.png 

给其执行权限,执行结果为

wKioL1PeLFHRBHaBAAAJDEj5wkU866.png 

这个简单的脚本开头是以“#!”这个表示在Linux中只要是可执行脚本都是以它开头,第二行开始凡是#开头的均为注释信息,并不运行。

上面截图中在执行脚本的时候使用bash内键指令“.”和“source”还可以使用# sh hello.sh

bash hello.sh来执行

bash编程是过程式编程语言,其执行方式有:顺序执行;选择执行;循环执行。

顺序执行:

选择执行:测试条件,可能会多个测试条件,某条件满足时,则执行对应的分支

循环执行:将同一段代码反复执行多次;因此,循环必须有退出条件;否则,则陷入死循环;

bash的循环语句:for循环;while循环;until循环。

其中for语句的格式如下

   for  VAR_NAME in LIST; do

       循环体

   done

LIST 中可以是一个元素也可以是多个元素

看个例子

创建十个用户user101..user111

wKiom1PeKziDu60DAAAI-wZWYRk634.png 

执行之后,查看一下

wKioL1PeLFKRDh5xAAAXXQ8x8iY237.png 

 

    bash的变量类别: 环境变量;局部变量;位置变量;特殊变量。

查看当前shell进程中得所有变量可使用set,查看点前shell进程中的所有环境变量可使用export,printenv和env。

    变量命名的要求:不能使用程序中的关键字如if,case,for等;只能使用字母,数字和下划线,且不能以数字开头;要见名知义。

    变量类型:数值型;字符型;布尔型。

    数值型可分:精确数值:整数;近似数值:浮点型(单精度浮点,双精度浮点)。

布尔类型结果只有两个true ,false。

特殊的shell变量:

              $0  获取当前执行的shell脚本的文件名

              $n  获取当前执行的shell脚本的第n个参数值,n=1..9

              $*  获取当前shell的所有参数 “$1 $2 $3 …,受IFS控制

              $#  获取当前shell命令行中参数的总个数

              $$  获取当前shell的进程号(PID

              $!  执行上一个指令的PID

              $?  获取执行的上一个指令的返回值(0 为成功, 非零为失败)

          $@  这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制

例如:一个脚本可以接受一个以上的文件路径作为参数;显示每个文件所拥的行数;显示本次共对多少个文件执行了行数统计;

wKioL1PeLFLRzyESAAAL7sGjpuA512.png 

    执行结果如下

wKiom1PeKzmym3UBAAAM12QDQm8234.png 

    

    while适用于循环次数未知,或不便用for直接生成较大的列表时;

    while循环格式   

          while 测试条件; do

               循环体

             done

假如要计算20以内所有整数之和

 

wKioL1PeLFOg8a8oAAANzMEm4kg112.png 

    执行结果

wKiom1PeKzrR6U84AAAHqQN4zTM719.png 

还可以使用until, 不过until的测试条件正好与while相反,其使用格式

until 测试条件; do

    循环体

done

wKioL1PeLFOSZyNPAAAN8Ns5tEw394.png 

其执行结果

wKiom1PeKzqyDx_gAAAI5FEIhP8050.png 

    在程序中有bash算术运算,下面对其详细说明

    算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。Shell中常用的数学运算符如下所示

       +:对两个变量做加法。

       -:对两个变量做减法。

       *:对两个变量做乘法。

       /:对两个变量做除法。

       **:对两个变量做幂运算。

       %:取模运算,第一个变量除以第二个变量求余数。

       +=:加等于,在自身基础上加第二个变量。

       -=:减等于,在第一个变量的基础上减去第二个变量。

       *=:乘等于,在第一个变量的基础上乘以第二个变量。

       /=:除等于,在第一个变量的基础上除以第二个变量。

       %=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。

在运算过程中let$[]可指向数学运算,

let指示数学运算。可以先将运算的结果赋值给变量b,运算命令是b=let 1 + 2。然后用echo $b来输出b的值。如果没有let,则会输出1+2

$[]表示数学运算。将一个数学运算写到$[]符号的中括号中,中括号中的内容将先进行数学运算。例如命令echo $[1+2],将输出结果3

declare核心语法:-i 声明为整数;-a 声明未数组;-f 声明未函数;-r 声明未只读。

 

Bash条件测试:整数测试;字符串测试;文件测试。

整数测试: -eq(等于),-ne(不等),-ge(大于等于),-le(小于等于),-gt(大于),-lt(小于)。

字符测试: ==, !=, > , < -z -n

文件测试:  -e FILE: 存在则为真;否则则为假;

                     -f FILE: 存在并且为普通文件,则为真;否则为假;

                     -d FILE: 存在并且为目录文件,则为真;否则为假;

                     -L/-h FILE: 存在并且为符号链接文件,则为真;否则为假;

                     -b: 块设备;

                     -c: 字符设备;

                     -S: 套接字文件;

                     -p: 命名管道;

              -s FILE: 存在并且为非空文件则为值,否则为假;

       多分支的if语句:

                   if 条件1; then

                       分支1

                    elif 条件2; then

                         分支2

                         ...

                         else

                       分支n

                         fi

 

    写一个脚本,生成两个随机数,比较其大小;显示大数;

bash有个内置变量:$RANDOM,显示随机数

wKioL1PeLFTSEAIPAAANsc-0R1U217.png 

    执行即可显示一个数字。

    条件判断类例子。

例:给定一个路径,判断如果为普通文件,显示之;如果为目录,显示之;否则,说无法识别。

 

wKiom1PeKzuDqoVUAAAQ79SA5fo475.png 

 

 

Bash组合条件测试。

bash知识点:组合条件测试:-a: 与,-o: 或,!: 非,单目操作符。

命令组合条件测试:&&: 与,||: 或,!: 非。

 

短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;

        与运算: 

        真 && 真 

        真 && 假 

        假 && {|} = 假 

        或运算:

        假 || 0 = 0

        假 || 1 = 1

        真 || 01 = 1

如下例子

[ -e /tmp/test10 ] || mkdir /tmp/test10

id $UserName &> /dev/null || useradd $UserName

! id $UserName &> /dev/null && useradd $UserName || echo "$UserName exists."

    id $UserName &> /dev/null && echo "$UserName exists." || useradd $UserName