shell脚本和其他编程语言一样提供了程序执行流if esle , do while ,for ,case,等。和其他编程语言一样,shell脚本的程序执行流的存在是为建立完整的逻辑思维,通过下面几个脚本来慢慢学习程序执行流。
首先是if else循环与do while循环的格式:
单分支:
if CONDITION ; then //需要注意CONDITION语句的格式:[ command ] command左右各有一个空格键,并用[ ]括起来
statement //statement可以是多条语句
...
fi
双分支:
if CONDITION ; then
statement
...
else
statement
...
fi
多分支:
if CONDITION ; then
statement
...
elif CONDITION ; then
statement
...
fi
我们来分析一下这个执行流的意思,
第一种:如果条件成立,那么执行statement,也就是说如果不成立,那么就不执行,直接到fi,执行下一个命令,这样的选择可以
让我们轻松的过滤一个条件;例如:如果 [一个人犯法了] 那么 [他就是坏人] 等于默认如果一个人没有犯法,那么他就不是坏人.
第二种:如果条件成立,那么执行statement,执行后到fi,如果不成立,那么执行else里的statement,执行后到fi, 它可以让我们指定两种分支来处理一个条件。
例如:如果 [一个人犯法了] 那么 [他就是坏人] 否则 那么 [他就是一个有待观察的人] 等于在第一种的基础上,又添加了一个处理
第三者:这一种,是第一种和第二种的结合,你可以使用elif 来细化 else的条件 ,既在else里使用if else循环,这样可以细化很多条件并处理,从而得到我们想要
的结果。
————————————————————————————————————————————————————————————————————————————————
do while 循环的格式:
while COMMAND; do
statemnet;
....
CONDITION
done
解析:while循环可以帮助我们实现一种“循环的处理”,也就是说不断的处理一个或者一些内容,或者是不断的执行某个或某些命令
例如用while循环来计算1~100的和
let N=1
let S=0
while [ N -le 100 ]; do //-le小于或等于
S=${$N+$S} //设一个计数器S 它等于上一次的S和这一次的N相加,实现累加
N++ //N自增1
done //注意while循环解说要加done
echo S //输出结果
————————————————————————————————————————————————————————————————————————————————
for 循环
for I in LIST ; do
statement1
statement2
done
LIST的格式: 简单列表: 1 2 3 4
复杂列表: This is TOM`s cat
命令 : `ls /var`
通配符 : for I in /var/*
列表可是说是for循环的核心,列表可以是命令,数字,文本,甚至是路径。它的处理方法灵活多变,在很多时候for循环的时候可以很清晰明了完成逻辑关系。
下边通过几个例子,来学习这些常见的程序执行流。
写一个脚本:
1、判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
2、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。c
##使用read -p命令,可以让打印提示信息并让用户输入一个变量的值
#!/bin/bash
#TEST=`bash +n $1` //测试脚本是否有语句错误
if [ $TEST!=0 ]; then //如果有错误,往下执行,否则,执行else语句
read -p “Q|q for quiting:”INPUT //提示按q或Q退出,并要求用户输入
if [ "$INPUT" == 'Q' -o "$INPUT" == 'q' ];then //判断输入的信息
echo "quiting"
else
while [ $TEST!=0 -a "$INPUT" != 'Q' ]; do //循环判断,如果还有错误并且没有输入Q
vim $1 //打开vim编辑
TEST=`bash +n $1` //再一次测试语法错误
read-p "Q|q for quiting:" INPUT //再一次提示是否退出
INPUT=`echo "$INPUT" | tr 'a-z' 'A-Z'` //这里将用户输入的小写字母变为大写
done
fi
fi
unset TEST INPUT
##此脚本运用了一个多支if else循环,和一个for循环,在判断用户输入时,第一个简单的if语句即可实现,但是第二个需将其转换为大写来满足脚本要求。
写一个脚本:
1、向系统中添加20个用户,名字为linuxer1-linuxer20,密码分别为其用户名,要使用while循环;
2、要求:在添加每个用户之前事先判断用户是否存在,如果已经存在,则不再添加此用户;
3、添加完成后,显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码,形如
#!/bin/bash
#
FILE=/etc/passwd
let N=1
while [ $N -le 20 ] ; do
grep "linuxer$N" $FILE >> /dev/null || useradd "linuxer$N";echo "linuxer$N" | passwd --stdin "linuxer$N" // || 或运算,条件不成立则执行下面的语句,成立则不执行下一条语句
let N++
done
for I in {1..20}; do //for循环,从1~20执行
grep "linuxer$I" $FILE | //抓取用户名linuxer1~20
awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}' //awk语句,在下一篇文章介绍
done