总结Bash Shell Flow Control语法

Last Updated: 2023-07-10 06:49:19 Monday

-- TOC --

本文总结bash shell脚本编程中的flow control。

if-else

if commands; then
  commands
[elif commands; then
  commands...]
[else
  commands]
fi

命令(command)后面,要么换行,要么分号。

if根据command执行后的返回码判断走哪个分支,成功then(0),失败else。

if true; then echo '123'; fi

不想写分号,拆开来是下面这样:

if true
then
  echo 'hello world'
fi

if false
then
  echo 'it is false' # 本行不会执行
fi

if后面可以跟任意数量的命令。这时,所有命令都会执行,但是判断真伪只看最后一个命令,即使前面所有命令都失败,只要最后一个命令返回0,就会执行then的部分。

$ if false; true; then echo 'hello world'; fi
hello world

test命令和条件判断

case

没有switch。

case $ftype in
    JPEG)
        if [ -z $opt ] || [ $opt == 'JPEG' ]; then
            python3 ${dn}/smally.py --jpegtran $1
        fi
        ;;
    PNG)
        if [ -z $opt ] || [ $opt == 'PNG' ]; then
            python3 ${dn}/smally.py --optipng $1
        fi
        ;;
    GIF)
        if [ -z $opt ] || [ $opt == 'GIF' ]; then
            python3 ${dn}/smally.py --gifsicle $1
        fi
        ;;
    *)
        echo something wroing here...;;
esac

最后一条匹配语句的模式是*,这个通配符可以匹配其他字符和没有输入字符的情况。

两个;;,是语法要求。

case的匹配模式可以使用各种通配符,下面是一些例子。

这里就是glob匹配吧...

while

while condition; do
  command1
  command2
  ...
done

写成一行是这样:

while true; do echo 'Hi, while looping ...'; done

不想写分号,是这样:

while true
do
  echo 'Hi, while looping ...';
done

until

until循环与while循环恰好相反,只要不符合判断条件(判断条件失败),就不断循环执行指定的语句。一旦符合判断条件,就退出循环。

until condition; do
  commands
done
until condition
do
  commands
done

无限循环:

$ until false; do echo 'Hi, until looping ...'; done
Hi, until looping ...
Hi, until looping ...
Hi, until looping ...
^C

for

for (( i=0; i<5; i=i+1 )); do
  echo $i
done

bash在两层括号内可以做算术运算。

for...in

for variable in list; do
  commands
done

示例:

$ for a in *; do echo $a; done
$ for a in a b c; do echo $a; done
a
b
c
$ for a in 1 2 3; do echo $a; done
1
2
3

break

continue

select

select结构主要用来自动生成简单的选项菜单。它的语法与for...in循环基本一致。

$ select a in a b c; do echo $a;break; done
1) a
2) b
3) c
#? 3
c

如果没有break,select结构也是在循环。

本文链接:https://cs.pynote.net/sf/linux/shell/202301151/

-- EOF --

-- MORE --