bash脚本编程:顺序执行 选择分支 循环执行shell
进入条件:编程
for:列表元素非空;bash
while:条件测试结果为“真”ide
unitl:条件测试结果为“假”测试
退出条件:spa
for:列表元素遍历完成;日志
while:条件测试结果为“假”it
until:条件测试结果为“真”for循环
循环控制语句:
class
continue:提早结束本轮循环,而直接进入下一轮循环判断;
while CONDITION1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
示例:求100之内全部偶数之和;
#!/bin/bash
#
declare -i evensum=0
declare -i i=0
while [ $i -le 100 ]; do
let i++
if [ $[$i%2] -eq 1 ]; then
continue 注:当eq=1就开始不往下执行了,开始新一轮循环
fi
let evensum+=$i
done
echo "Even sum: $evensum"
break:提早跳出循环
退出方式:某个测试条件知足时,让循环体执行break命令;
格式: while CONDITION1; do
CMD1
...
if CONDITION2; then
break
fi
done
建立死循环:
while true; do
循环体
done
示例:求100之内所奇数之和
#!/bin/bash
#
declare -i oddsum=0
declare -i i=1
while true; do
let oddsum+=$i
let i+=2
if [ $i -gt 100 ]; then
break 注:当$i大于100时退出循环
fi
done
sleep命令:程序的睡眠时间
格式:sleep NUMBER
练习:每隔3秒钟到系统上获取已经登陆用户的用户的信息;其中,若是logstash用户登陆了系统,则记录于日志中,并退出;
#!/bin/bash
#
while true; do
if who | grep "^logstash\>" &> /dev/null; then
break
fi
sleep 3
done
echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#!/bin/bash
#
until who | grep "^logstash\>" &> /dev/null; do
sleep 3
done
echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log
while循环的特殊用法(遍历文件的行):
格式:
while read VARIABLE; do
循环体;
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将基赋值给VARIABLE变量;
示例:找出ID号为偶数的用户,显示其用户名、ID及默认shell;
#!/bin/bash
#
while read line; do
userid=$(echo $line | cut -d: -f3)
username=$(echo $line | cut -d: -f1)
usershell=$(echo $line | cut -d: -f7)
if [ $[$userid%2] -eq 0 ]; then
echo "$username, $userid, $usershell."
fi
done < /etc/passwd
for循环的特殊用法:
格式: for ((控制变量初始化;条件判断表达式;控制变量的修正语句)); do
循环体
done
控制变量初始化:仅在循环代码开始运行时执行一次;
控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,然后再作条件判断;
示例:求100之内全部正整数之和
#!/bin/bash
#
declare -i sum=0
for ((i=1;i<=100;i++)); do
let sum+=$i
done
echo "Sum: $sum."
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
示例:打印九九乘法表
#!/bin/bash
#
for ((j=1;j<=9;j++)); do
for ((i=1;i<=j;i++)); do
echo -e -n "${i}X${j}=$[${i}*${j}]\t"
done
echo
done