Last Updated: 2023-07-10 06:49:19 Monday
-- TOC --
本文总结bash shell脚本编程中的flow control。
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
没有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的匹配模式可以使用各种通配符,下面是一些例子。
a)
:匹配a。a|b)
:匹配a或b。[ab])
:同上。[[:alpha:]])
:匹配单个字母。???)
:匹配3个字符的单词。*.txt)
:匹配.txt结尾。*)
:匹配任意输入,一般作为case结构的最后一个模式。这里就是glob匹配吧...
while condition; do
command1
command2
...
done
写成一行是这样:
while true; do echo 'Hi, while looping ...'; done
不想写分号,是这样:
while true
do
echo 'Hi, while looping ...';
done
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 (( i=0; i<5; i=i+1 )); do
echo $i
done
bash在两层括号内可以做算术运算。
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
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 --