1.选择结构
——》if...then式
a)最复杂的情形:
if [条件表达式1]; then 当条件表达式1成立时,可以进行的命令工作内容 elif [条件表达式2]; then 当条件表达式2成立时,可以进行的命令工作内容 else 当条件表达式1和2均不成立时,可以进行的命令工作内容 fi
b)例子:
#!/bin/bash read -p "Please input (Y/N): " yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "OK,continue..." elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then echo "Oh,interrupt!" else echo "I don't know what your choice is" fi
——》case...esac式
a)情形:
case $variable in "第一个变量内容") 程序段 ;; "第二个变量内容") 程序段 ;; *) 程序段 ;; esac
b)例子:
#!/bin/bash case $1 in "hello") echo "Hello,how are you?" ;; "") echo "You must input parameter,ex> {$0 someword}" ;; *) echo "Usage $0 {hello}" ;; esac
2.循环结构
——》while-do-done
a)情形:
while [ 条件表达式 ] do 程序段 done
b)例子:
while [ "$yn" != "yes" -a "$yn" != "YES" ] do read -p "Please input yes/YES to stop this program: " yn done echo "OK!you input the correct answer."
——》until-do-done
a)情形:
until [条件表达式] do 程序段 done
b)例子:
until [ "$yn" == "yes" -a "$yn" == "YES" ] do read -p "Please input yes/YES to stop this program: " yn done echo "OK!you input the correct answer."
——》for-do-done固定循环
a)情形:
for variable in cond1 cond2 cond3 ... do 程序段 done
b)例子:
for variable in $(seq 1 14) do echo "The number is: $variable" done
——》for-do-done的数值处理
a)情形:
for((初始值; 限制条件; 执行步长)) do 程序段 done
b)例子:
#1 sum=0; for((i=1; i<=100; i=i+1)) do sum=$((sum+$i)) done echo "The sum is: $sum" #2 sum=0 for((i=1; i<=100; i=$(($i+1)))) do sum=$((sum+$i)) done echo "The sum is: $sum" Question:#1和#2经过验证都是正确的。可为什么在#1中执行步长可以写成i=i+1呢?严格来说是i=$(($i+1))的啊 Answer:难道说,这里的i相当于是declare -i i吗
备注:
关于循环遍历的几个举例:
##遍历目录下面有哪些文件或目录 (1)for file in ./* #遍历当前目录下有哪些文件或目录 (2)for file in * #同上 (3)for file in `ls -1 pack_wzj` #遍历目录pack_wzj下有哪些文件 (4)for file in $(ls -1 pack_wzj #同上 ##遍历文件中内容 (1)for file in $(cat list) #逐行遍历文件list中的内容 (2)for file in `cat list` #同上 (3) cat list | while read _line # 同上 do echo $_line done (4) while read _line #同上,如果list文件中有多列,此处_line可以写成多个变量,例如while read name age; do echo $_line done < list
备注:
(A)read是一个命令哦
(B)通过使用ps aux | grep pattern | awk '{print $2}' | while read line 可以找到符合条件的进程号列表,然后进行批量处理。例如,
ps aux | grep -v grep | awk '{print $2}' | while read line; do kill -9 $line; done
(C)使用for快速批量处理的命令
for x in `cat hostlist`; do ( ssh $x "cd /home/wahaha/ && ls -l | tail -1" )& done for x in `get_instance_by_service AS-MATRIX.NOVA.hz`; do { ssh $x "cd /home/wahaha/ && ls -l | tail -1"; }& done
3.关于条件表达式的一点闲话
if中的条件判断式用的就是[ ]判断符号,因为[ ]用户和test命令几乎一样,所以如果不知道[ ]中某个符号的含义,就是man test看看喽。
多个条件形成一个复合表达式的方式有两种:
a)写在一个[ ]内:例如,[ exp1 -o exp2 ]
b)通过逻辑操作符连接多个[ ]:例如,[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]
Remarks:
a)例如,[ "$variable" == "Y" -o "$variable" == "y"]与[ "$variable" == "Y" ] || [ "$variable" == "y" ]的含义是一样的
b)[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]中的||,&&与cmd1 || cmd2,cmd1 && cmd2中的||,&& 意涵是不一样的。在[ exp1 ] || [ exp2 ],[ exp1 ] && [ exp2 ]中||,&&是逻辑操作符的含义