shell常用语法(续)
while循环语句
- 语法结构
while expr # 执行 expr
do # 若 expr 的退出状态为0,进入循环,否则退出while
commands # 循环体
done # 循环结束标志,返回循环顶部
- 执行过程
先执行 expr,如果其退出状态为 0,就执行循环体。执行到关键字 done 后,回到循环的顶部,while 命令再次检查 expr 的退出状态。以此类推,循环将一直继续下去,直到 expr 的退出状态非 0 为止。
until循环语句
- 语法结构
until expr # 执行 expr
do # 若expr的退出状态非0,进入循环,否则退出until
commands # 循环体
done # 循环结束标志,返回循环顶部
- 执行过程
与 while 循环类似,只是当 expr 退出状态非 0 时才执行循环体,直到 expr 为 0 时退出循环。
break和continue
- break [n]
用于强行退出当前循环。
如果是嵌套循环,则 break 命令后面可以跟一数字 n,表示退出第 n 重循环(最里面的为第一重循环)。 - continue [n]
用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环。
如果是嵌套循环,continue 命令后面也可跟一数字 n,表示回到第 n 重循环的顶部。
例1:一个二重循环,如何使用continue跳出循环
#!/bin/bash
#scriptname:script.sh
for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
for week in 1 2 3 4
do
echo -n "processing the month of $month. OK?"
read ans
if [ "$ans"=n -o -z "$ans" ];then
continue 2
else
echo -n "processing week $week of $month?"
read ans
if [ "$ans"=n -o -z "$ans" ];then
continue
else
echo "Now processing week $week of $month"
sleep 1
echo "Done processing"
fi
fi
done
done
exit和sleep
- exit n
exit 命令用于退出脚本或当前进程。n 是一个从 0 到 255 的整数,0 表示成功退出,非零表示遇到某种失败而非正常退出。该整数被保存在状态变量 $? 中。 - sleep n
暂停 n 秒钟
select循环和菜单
- 语法结构
select variable in list
do # 循环开始的标志
commands # 循环变量每取一次值,循环体就执行一遍
done # 循环结束的标志
- 说明
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中。
例2:用户选择想要执行的命令(输入数字进行选择)
#!/bin/bash
PS3="select a program to excute:"
select program in 'ls -F' pwd date
do
$program
done
select和case
- select
select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环。 - select 经常和 case 联合使用
例3:
#!/bin/bash
PS3="please choose one of the three boys:"
select choice in tom dan guy
do
case $choice in
tom)
echo Tom is a cool dude!
break;;
dan | guy )
echo Dan and Guy are both wanderful.
break;;
*)
echo "$REPLY is not one of your choices"
echo "Try again"
;;
esac
done
循环控制 shift 命令
- shift [n]
用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift。
例4:
#!/bin/bash
#name:doit.sh
#usage:doit.sh [args]
#example: ./doit.sh a b c d e f g
while (($# > 0)) #or [$# -gt 0]
do
echo $*
shift
done
例5:
#!/bin/bash
#using 'shift' to step through all the positional parameters
until [ -z "$1" ] #until all parameters used up
do
echo "$1"
shift
done
echo
exit 0
随机数和 expr 命令
- 生成随机数的特殊变量
echo $RANDOM 范围是: [0, 32767] - expr:通用的表达式计算命令
表达式中参数与操作符必须以空格分开,表达式中的运算可以是算术运算,比较运算,字符串运算和逻辑运算。
例如:
expr 5 % 3
expr 5 * 3 # 乘法符号必须被转义
字符串操作
例6:
#!/bin/bash
dirname="/usr/bin/local/bin";
echo "dirname=$dirname"
echo -n '${#dirname}='; sleep 4;echo "${#dirname}"
echo
echo -n '${dirname:4}='; sleep 4;echo "${dirname:4}"
echo
echo -n '${dirname:8:6}='; sleep 4; echo ${dirname:8:6}
echo
echo -n '${dirname#*bin}='; sleep 4; echo ${dirname#*bin}
echo
echo -n '${dirname##*bin}='; sleep 4;echo ${dirname##*bin}
echo
echo -n '${dirname%bin}='; sleep 4;echo ${dirname%bin}
echo
echo -n '${dirname%%bin}='; sleep 4;echo ${dirname%%bin}
echo
echo -n '${dirname%bin*}='; sleep 4;echo ${dirname%bin*}
echo
echo -n '${dirname%%bin*}='; echo ${dirname%%bin*}
echo
echo -n '${dirname/bin/sbin}='; echo ${dirname/bin/sbin}
echo
echo -n '${dirname//bin/lib}='; echo ${dirname//bin/lib}
echo
echo -n '${dirname/bin*/lib}='; echo ${dirname/bin*/lib}
脚本调试
- sh –x 脚本名
该选项可以使用户跟踪脚本的执行,此时 shell 对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。
shell 显示脚本中的行时,会在行首添加一个加号 “ + ”。 - sh –v 脚本名
在执行脚本之前,按输入的原样打印脚本中的各行,
打印一行执行一行。 - sh –n 脚本名
对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容。