bash知识点:while循环
for varName in 列表;do
循环体
done
条件测试:
执行条件:命令成功,条件测试成功;否则为失败
根据$?,状态返回值
表达式:
[ expreession ]
[[ expression ]]
test expression
while 条件测试:do
循环体
done
while循环:条件测试成功,则循环;失败,则退出
如何退出?
必须有时刻,条件测试不成功
? :条件控制变量
练习:求100以内所有正整数的和
sum=0
i=1
while [
i−le100];doletsum+=
i
−
l
e
100
]
;
d
o
l
e
t
s
u
m
+
=
i
let i++
done
echo $sum
如何让循环退出:在循环体中改变测试条件中用于控制循环次数的变量的值
1.练习:
提示输入一个用户名,存在则显示UID和shell,不存在显示用户不存在,为空显示为空
1 #!/bin/bash
2 #
3 read -p "Enter a user name: " username
4 while [[ "$username" != "quit" ]]; do
5 if [ -z "$usename" ];then
6 echo "user name null"
7 elif id $username &> /dev/null;then
8 grep "^$username\>" /etc/passwd | cut -d: -f3,7
9 else
10 echo "no such user"
11 fi
12 read -p "Enter a user name: " username
13 done
bash编程之until循环;
until 测试条件;do (等价于,while !测试条件;do)
循环体
done
条件不满足,则循环;否则,退出
bash编程之组合测试条件深入
逻辑与:多个条件同时满足
[ 条件1 ] && [ 条件2 ]
[ 条件1 -a 条件2 ]
[[ 条件1 && 条件2 ]]
注意:前两个使用单双中括号都可,但&&不允许用于单个中括号中,所有第三者只能用于双中括号中
逻辑或:多个条件满足一个
[ 条件1 ] || [ 条件2 ]
[ 条件1 -o 条件2 ]
[[ 条件1 || 条件2 ]]
注意 || 不允许出现在单中括号中
德摩根 定律
!(条件1或者 条件2) = !条件1 并且!条件2
!(条件1且条件2)=!条件1 或者 !条件2
使用while循环一次读取文件的一行,直到文件尾部:
while read line ;do
循环体
done < /path/to/somefile
取出当前系统上,默认shell为bash的用户
练习:取出当前系统上,默认shell为bash的用户
显示/etc/passwd UID为偶数的用户
#!/bin/bash
while read line;do
#echo $line
num=`echo $line | cut -d: -f3`
if [ $[$num%2] -eq 0 ];then
echo -n "$num"
echo $line | cut -d: -f1
fi
done < /etc/passwd
显示/etc/rc.d/rc.sysinit大于30的行
#!/bin/bash
while read line;do
count=`echo $line | wc -c`
if [ $count -gt 30 ];then
echo $line
fi
done < /etc/rc.d/rc.sysinit
练习:写一个脚本,完成如下任务
1.提示用户输入一个磁盘设备文件路径不存在或不是一个块设备,则提示用户重新输入,知道输入正确为止,或者输入quit以9为退出码结束脚本
2.提示用户”下面的操作会清空磁盘的数据,并提问是否继续”
如果用户给出字符y或yes,则继续,否则,则提供以8为退出码结束脚本
3、将用户指定的磁盘上的分区清空,而后创建两个分区,大小分别为100M和512M
4格式化这两个分区
5将第一个分区挂载至/mnt/boot目录,第二个分区挂载至/mnt/sysroot目录
#!/bin/bash
read -p "Enter you dev " devdir
umonut /mnt/boot
umonut /mnt/sysroot
while [[ "$devdir" != "quit" ]];do
[ -a $devdir ] && [ -b $devdir ]
if [[ $? -eq 0 ]];then
read -p "Are you sure[y|yes]: " option
if [[ "$option" == "y" || "$option" == "yes" ]];then
dd if=/dev/zero of=$devdir bs=512 count=1 &> /dev/null
echo -e "n\np\n1\n\n+100M\nn\np\n2\n\n+512M\nw" |fdisk $devdir
mke2fs -t ext4 ${devdir}1
mke2fs -t ext4 ${devdir}2
mount ${devdir}1 /mnt/boot
mount ${devdir}2 /mnt/sysroot
# echo "${devdir}1 /mnt/boot ext4 default 0 0" >> /etc/fstab
# echo "${devdir}2 /mnt/sysroot ext4 default 0 0" >> /etc/fstab
exit 7
else
exit 8
fi
else
read -p "Enter you dev again: " devdir
fi
done