shell脚本编程(二)——常用语法(续)

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 会报错,如果没有错误,则不显示任何内容。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值