条件判断
if 语句
if 语句通过判断条件的返回值真假来执行不同的分支中的命令。
语法:
if 判断条件1 ;then 判断条件1为真执行的COMMAND elif 判断条件2 ;then #可以有任意个,没有或者多个 判断条件2为真执行的COMMAND else #只能且必须存在一个 当以上判断条件皆为假时执行的COMMAND fi
当 if 语句判断到一个条件为真时,那么将执行其中的命令,并且不再继续判断后续的语句。
case 语句
case 语句通过匹配判断条件的模式来执行不同分支中的命令。
语法:
case 变量引用 in 模式1) 匹配模式1时执行的COMMAND ;; 模式2) 匹配模式1时执行的COMMAND ;; ... #可以有任意个匹配模式 *) #可有可无,但是为了保证判断语句的强壮性,建议添加 当变量没有匹配到以上的模式时执行的COMMAND ;; esac
case 语句的匹配模式使用 glob 风格的通配符
循环控制
for 语句
语法:
for 语句会将列表中的元素依次赋给语句中的变量,每一次赋值执行一次循环体,直到列表中元素耗尽。
#shell风格 for 变量 in 列表 ;do 循环体 done
for 语句中控制变量初始值在整个循环中只会执行一次,而控制变量修正则会每次循环都执行一次,当循环控制条件为假时,循环停止。
#C语言风格 for ((控制变量初始值;循环控制条件;控制变量修正)) ;do 循环体 done
范例:打印等腰三角形
#!/bin/bash read -p "line number is: " line for ((l=1;l<=line;l++)) ;do space=$(printf "%-$[$line-$l]s") echo -e "${space}\c" star=$(printf "%-$[$l*2-1]s" "*") echo "${star// /*}" done
while 语句
while 语句会在循环控制条件为真时进入循环。每次循环开始时判断循环条件,在循环条件为假时退出循环。
语法:
while 循环控制条件 ;do 循环体 #一般在循环体中会对循环控制变量进行修正 done
当然,如果循环判断条件永远为真,那么将会陷入死循环
while true ;do
循环体
done
while 语句可以配合 read 语句进行逐行处理
语法:
#对命令的标准输出进行逐行处理 命令 | while read ;do 循环体 done #对文件中的内容进行逐行处理 while read ;do 循环体 done < 文件
until 语句
until 语句会在循环控制条件为假时进入循环。每次循环开始时判断循环条件,在循环条件为真时退出循环。
语法:
while 循环控制条件 ;do 循环体 #一般在循环体中会对循环控制变量进行修正 done当然,如果循环判断条件永远为假,那么将会陷入死循环
until false ;do 循环体 done
范例1:打印九九乘法表
#!/bin/sh for i in $(seq 9) ;do for j in $(seq $i) ; do let over=$[i*j] echo -ne "${j}x${i}=$over\t" done echo done范例2:计算100以内所有奇数的和
#!/bin/bash sum=0 i=1 while [ $i -le 100 ] ;do let sum+=i let i+=2 done echo $sum
break 语句
当循环执行到 break 语句时,会退出指定循环。
语法:break [N]
N 为循环嵌套层次,当前循环为第1层,缺省为退出当前循环。
范例:打印200以内的斐波那契数列
#!/bin/bash read num for ((stp=0;stp>=0;stp++)) ;do if [ $stp -eq 0 ] ;then res2=$stp echo $res2 elif [ $stp -eq 1 ] ;then res1=$stp echo $res1 else res=$[$res1+$res2] if [ $res -le $num ] ;then echo "$res" res2=$res1 res1=$res else break fi fi done
continue 语句
当循环执行到 continue 语句时,会跳出指定循环,开始下轮循环。
语法:continue [N]
N 为循环嵌套层次,当前循环为第1层,缺省为跳出当前循环。
shift 语句
shift 语句用于将参数列表中的参数移动指定次数。
当参数移动时,处于最左端的参数将被移除。
范例:打印数字等腰三角形
#!/bin/bash while [ $# -gt 0 ] ;do echo $* shift done
功能语句
select 语句
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准输出上,并显示 PS3 提示符,等待用户输入。
语法:
select 变量 in 列表 ;do 循环体 #一般为条件判断语句 done
输入对应的数字,会将列表中对应的数据赋值给变量,也可以使用位置变量,而输入的数字则会保存在 REPLY 变量中。另外,select 语句为无限循环语句,在使用 select 语句时最好设置 break 或 exit 等退出循环的方法。
范例:
#!/bin/bash list="C语言 Python PHP Java PowerShell 退出" select language in $list ;do case $language in C语言) echo "万物始于C语言" ;; Python) echo "简而美" ;; PHP) echo "PHP是天下最好的语言??" ;; Java) echo "啥都做" ;; PowerShell) echo "这才是最好的语言!!" ;; 退出) exit ;; esac done
trap 语句用于捕捉信号后执行触发行为,而不执行系统原有操作。信号可以是全称,简写,也可以是数字。
语法:trap '触发后行为' 信号
触发后行为:
CMD:执行制定的命令
NULL:忽略信号操作
-:恢复系统原有操作