2.1.1 Shell脚本常用语句
条件判断
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:忽略信号操作
-:恢复系统原有操作
上一篇: shell脚本--循环的使用(for和while)
下一篇: 编写Java的感悟