bash 条件语句

跟其它程序设计语言一样,Bash中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在[[ ]] sh中是[ ])里的表达式。[[ ]]包起来的表达式被称作 检测命令 或 基元

条件表达式可以包含&&||运算符,分别对应  和  。共有两个不同的条件表达式:ifcase

跟文件系统相关:

基元含义
[ -e FILE ]如果FILE存在 (exists),为真
[ -f FILE ]如果FILE存在且为一个普通文件(file),为真
[ -d FILE ]如果FILE存在且为一个目录(directory),为真
[ -s FILE ]如果FILE存在且非空(size 大于0),为真
[ -r FILE ]如果FILE存在且有读权限(readable),为真
[ -w FILE ]如果FILE存在且有写权限(writable),为真
[ -x FILE ]如果FILE存在且有可执行权限(executable),为真
[ -L FILE ]如果FILE存在且为一个符号链接(link),为真
[ FILE1 -nt FILE2 ]FILE1FILE2新(newer than)
[ FILE1 -ot FILE2 ]FILE1FILE2旧(older than)

跟字符串相关:

基元含义
[ -z STR ]STR为空(长度为0,zero)
[ -n STR ]STR非空(长度非0,non-zero)
[ STR1 == STR2 ]STR1STR2相等
[ STR1 != STR2 ]STR1STR2不等

算数二元运算符:

基元含义
[ ARG1 -eq ARG2 ]ARG1ARG2相等(equal)
[ ARG1 -ne ARG2 ]ARG1ARG2不等(not equal)
[ ARG1 -lt ARG2 ]ARG1小于ARG2less than)
[ ARG1 -le ARG2 ]ARG1小于等于ARG2less than or equal)
[ ARG1 -gt ARG2 ]ARG1大于ARG2greater than)
[ ARG1 -ge ARG2 ]ARG1大于等于ARG2greater than or equal)

条件语句可以跟 组合表达式 配合使用:

OperationEffect
[ ! EXPR ]如果EXPR为假,为真
[ (EXPR) ]返回EXPR的值
[ EXPR1 -a EXPR2 ]逻辑 , 如果EXPR1和(and)EXPR2都为真,为真
[ EXPR1 -o EXPR2 ]逻辑 , 如果EXPR1或(or)EXPR2为真,为真

1. if语句

# 1. 一个分支
NUM=3
if [[ ${NUM} -eq 3 ]]; then
  echo "true"
fi

# 2. 两个分支
if [[ ${NUM} -ne 1 ]]; then
  echo "true"
else
  echo "false"
fi

# 3.多个分支
NAME="MIKE"
if [[ ${NAME} == "mike" ]]; then
  echo "It's mike!"
elif [[ ${NAME} == "MIKE" ]]; then
  echo "It's mike!"
else
  echo "wrong name!"
fi

2. case 语句

  • 在 case 命令后面跟着的参数是被匹配的模式,这里用 $1 来获取执行脚本时传入的第一个参数。在 in 参数跟着可以处理的模式列表,每一项用 ) 作为结尾。
  • 可以用 2 | 3 | 4) 这样的形式来匹配多个模式,每个模式用 | 隔开。如果写为 1) | 2) | 3) 的形式会报错。即,只有最后一个模式才用 ) 来结尾。
  • 模式列表不限于数字,可以是不带引号的字符串、带引号的字符串、bash 的扩展语句、通配符,等等。例如上面使用了 $var 来匹配 var 变量的值。
  • 如果要匹配的字符串带有空格,一定要用引号括起来,否则会报错。
  • 可以使用 * 通配符来表示匹配任意内容,类似于默认分支语句,这个语句一定要写在最后面,否则会先匹配到它,影响它后面语句的匹配。
  • 每个模式处理完之后,一定要用 ;;;&、或者 ;;& 来结尾。如果这三个都没有提供则会报错。
  • ;; 表示不再往下匹配,会结束整个 case 命令的执行。作用类似于在 select 中执行 break 命令。
  • ;& 表示继续执行下面一个模式里面的语句,不检查下一个模式是否匹配。上面的 "big lion") 模式使用了 ;& 结尾,从执行结果可以看到,它会往下执行 "fall through from big lion") 模式的语句。
  • ;;& 表示继续往下匹配,如果找到匹配的模式,则执行该模式里面的语句。上面的 2 | 3 | 4) 模式使用了 ;;& 结尾,当匹配到 2 时,它继续往下匹配,中间没有找到匹配项,一直到 *) 才匹配,执行了 *) 模式里面的语句。当匹配到 4 时,往下匹配到了 $var) 模式,然后 $var) 模式里面用 ;; 结束执行,没有再往下匹配。
case ${panel} in
    exon)
      echo "got subpan";;
    subpan) 
      echo "got subpan";;      
    pan)
      echo "got pan";;      
    *)
     echo "wrong panel";;
esac

# 联合getopts命令
while getopts "bf" arg; do
    case ${arg} in
        b) handle_option_b ;;
        f) handle_option_f ;;
        ?) show_help ;;
    esac
done

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值