pro bash programming学习笔记——第三章

循环与分支

测试一个表达式

可以用test或[ ... ]

与文件相关的测试

是否存在:-e或-a
是否是文件:-f
是否是目录:-d
是否是一个符号链接:-h或-L
是否可执行:-x

整数比较

是否相等:-eq
是否不相等:-ne
类似还有:-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于)
如输入:
test 1 -eq 1
echo $?
则输出为0

字符串测试

测试两个字符串是否相等可以用=和!=号
test "$a" = "$b"
[ "$q" != "$b" ]
注意变量用双引号引起来,这样做是为了使变量为空时不会出错,另外等号和不等号左右两边都有空格,还有就是‘[’号后和‘]’号前都要有空格。

字符串是否为空:-z
字符串是否不为空:-n

>和<经过转义后可用来对两个字符串进行比较,如
str1=abc
str2=def
test "$str1" \< "$str2"
echo $?
输出会是0。

多个判断可以用-a(AND)和-o(OR)连接起来

如:
test -f /path/to/file -a $test -eq 1
test -x bin/file -o $test -gt 1

[[是[的增强,可以支持更复杂的式子(比如正则表达式等)。
例:
 string=whatever
 [[ $string =~ h[aeiou] ]]
 echo $?
将会输出0。

((可以用来计算表达式,如
(( a = $a + 3 ))
会将a的值增加3。
test $(( $a - 2 )) -ne 0
用于比较a - 2的值是不是不等于0。

分支语句

if

if语句的形式为:
if <condition list>
then
   <list>
fi

如果加上一个else的话,形式为:
if <condition list>
then
   <list>
else
   <list>
fi

如果还有else if的话,形式为:
if <condition list>
then
   <list>
elif <condition list>
then
   <list>
else
   <list>
fif

例:
printf "Enter a number between 10 and 20 inclusive: "
read number
if [ "$number" -lt 10 ]
then
     printf "%d is too low\n" "$number" >&2
     exit 1
elif [ "$number" -gt 20 ]
then
     printf "%d is too high\n" "$number" >&2
     exit 1
else
     printf "You entered %d\n" "$number"
fi

判断语句中可以使用&&和||与C语言中的与和或一样。
也可以这样认为:
只有当&&前面的语句正常执行了,其后面的语句才会执行(这就相当于只有&&前面为true才会看后面的,否则肯定整个语句为false)
只有当||前面的语名没有正常执行时,其后面的语句才会执行。

例如:
mkdir "$HOME/bin" && cd "$HOME/bin" || exit 1
会创建一个目录并进入该目录,如果两者有一个不成功,则会执行exit 1

if [ -d "$dir" ] && cd "$dir"
then
     echo "$PWD"
fi
等等。

case

形式为:

case WORD in
   PATTERN) COMMAND;;
   PATTERN) COMMAND;;
esac

PATTERN可以是路径扩展模式(pathname expansion patterns),以*和?为通配符。也可以是符号串或[ ... ]表示范围。
例:
case $1 in
     *"$2"*) true ;;
     *) false ;;
esac
可用于判断字符串$2是不是$1的子串。(注:此方法比用grep来判断要快,因为它不会产生新进程。)
case $1 in
     *[!0-9]*) false;;
     *) true ;;
esac
可用于判断$1是不是整数。

case $# in
     3) ;; ## We need 3 args, so do nothing
     *) printf "%s\n" "Please provide three names" >&2
        exit 1
        ;;
esac
用于判断参数个数是否为3。

循环语句

while

形式为:
while <list>
do
   <list>
done

例:
n=1
while [ $n -le 10 ]
do
   echo "$n"
   n=$(( $n + 1 ))
done


while IFS= read -r line
do
   : do something with "$line"
done < FILENAME
从文件FILENAME中一次读一行进行操作。

until

类似
n=1
until [ $n -gt 10 ]
do
   echo "$n"
   n=$(( $n + 1 ))
done


for

会从一个list中依次取值进行操作。
例:
for var in Canada USA Mexico
do
   printf "%s\n" "$var"
done


也可以跟C语言类似,如:
for (( n=1; n<=10; ++n ))
do
   echo "$n"
done


bread和continue

如C语言类似
while :
do
   read x
   [ -z "$x" ] && break
done


在break后可以接数字,从而跳出更外层的循环。
如:
for n in a b c d e
do
   while true
   do
      if [ $RANDOM -gt 20000 ]
      then
         printf .
         break 2 ## break out of both while and for loops
      elif [ $RANDOM -lt 10000 ]
      then
         printf '"'
         break ## break out of the while loop
      fi
   done
done

continue略


总结

相关命令

test:计算一个表达式并返回成功或失败。
if,case,while, until, for, break, continue






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值