结构化命令——流程控制,
注意:“命令”,非“关键字”
条件判断— if
1 )简单 if
if command # command 返回成功——即退出状态为 0 时为真
then
commands
fi
等价于:
if command; then #; 只是用于将 then 放到同一行
commands
fi
2 )完整格式的 if
if command; then
...
elif command; then
...
else
...
fi
条件判断— case
case $variable in
patten1|patten2) command1s;; # 使用 | 表多个可能,使用 )
patten3) command2s;; #commands 最后的语句需使用 ;;
*) default commands;; #*) 表示 default
esac
循环— for
1) 简单 for
for var in list; do # 此处定义了变量 var ,所以不要使用 $
...
done
eg:
for test in 12s 2 3 4aa #test 不使用 $ , 12s 等不使用引号!引号用于将引起来的内容作为一个整体
do
echo $test
done
2) 带有引号时
for test in "12's" 2 3 4aa #用双引号将单引号括起来,反过来也可以吧( TBD )
do
echo $test
done
3) 带有空格时
for test in "12 s" 2 3 4aa #同样使用引号
do
echo $test
done
4) 使用变量列表
list="12 2 3 4aa" TBD :怎样引用某个列表元素?
for test in $list
do
echo $test
done
# TBD :列表中有空格怎么表示?没找到办法,改下 IFS 吧。
列表中增加元素
list=$list" abc" #使用引号并且要有空格
5) BASH 用作分隔符的字符列表
$IFS , internal field seperator ,默认为空格、 tab 、换行,将影响 for 的处理—— TBD 影响 gawk 的是否也是它?
IFS = $'/n' #更改 IFS
list="12:2:3:4aa bb"
IFS=$': ' #以 : 及空格作为 IFS
for test in $list
do
echo $test
done
6) 遍历文件
for file in /home/test/*.log /home/aaa/ #可指定多个文件夹
eg:
for test in /home/xgdxiao/* /home/noth/*
#必须使用通配符,不能简单地写个目录名,可同时指定多个目录
do
if [ -f $test ]; then #必须对文件进行测试,否则可能输出“ /home/noth/* ”
echo $test
elif [ -e $test ]; then
echo -n
else
echo $test is nth
fi
done
7) c 式的 for
for((a = 1; a <10; a++)); do # 格式比较自由,变量引用无须 $ ,可使用空格,无须转义
echo $a
done
for((a=1, b=2; a<=1 && b> 0; a++,b--)); do #多个变量
echo $a $b
done
循环— while
1 )简单形式:
while test command; do #test command 含义同 if 语句
...
done
eg:
i=2
while [ $i -gt 0 ]; do
echo $i
i=$[$i -1 ]
done
2 )多个条件,只有最后一个用于判断:
i=2
while echo $i; [ $i -gt 0 ]; do
i=$[$i -1 ]
done
循环— until
1 )一般形式
until test commands; do
...
done
2 )多个条件式,处理方式同 while
i=2
until echo $i; [ $i -gt 0 ]; do # 多条命令的处理与 while 类似
echo $i;
i=$[$i -1 ]
done
循环—例子
#!/bin/bash
#IFS.OLD=$IFS
IFS=$'/n' # 控制下面 for
for sth in `cat /etc/passwd|grep root`; do
echo $sth
IFS=: #控制下面的 for
for ath in $sth; do
echo $ath
done
IFS=/n #需要还原 IFS
done
循环— break/continue
break n #跳出 n 层循环, n 默认为 1
continue n #要继续的循环级别
while [ 1 ] ; do #TBD: 是否可写成 while 0 ; do
for((i=0; i<2; ++i)); do
echo $i
if [ $i -eq 1 ]; then
break 2
fi
done
done
循环—输出重定向或管道
循环里的输出重定向或管道
for((i=0; i<2; ++i)); do
echo $i
if [ $i -eq 1 ]; then
break 2 #超出总层次也没关系
fi
done > a.txt #直接在循环后加重定向, TBD ,错误输出是否写为 2>a.txt
for((i=0; i<200; ++i)); do
echo $i
done |more #管道