bash编程(三)之循环编程
bash三种循环:for循环,while循环,until循环。这些循环熟练掌握一种循环便可。数组
知识点:bash
1、信号捕捉:trap 'command;command' ide
2、循环控制:函数
continue:提早进入下一轮循环测试
一般用于条件语句中,仅在某些特殊场景下ui
break [n]:跳出当前[n]层循环spa
一般用于条件语句中,仅在某些特殊场景下排序
echo true 真ip
echo $RANDOM 生成随机数
循环:
事先提供一个元素列表,然后,使用变量去遍历此元素列表,每访问一个元素,就执行一次循环体,直到元素列表访问完毕。
for:遍历有限的元素列表
语法格式:
for VAR_NAME in LIST
do
循环体
done
注: LIST列表:中间包括一个或多个元素
生成列表的方式:
1、手动给个列表:
fori in 1 2 3 4 5;
2、数值列表:
{start..end}
例如:{1..100}
3、$*, $@
4、命令生成列表 {start..end}
`seq [start [increment]] end`
`seq 4 3 10` 命令引用(从4开始步进为3到10,结果为:4、7、10)
2、until格式
until 测试条件;do
循环体
done
测试条件为假,进入循环。测试条件为真,退出循环。
测试条件通常经过变量来描述,须要在循环体不断地改变变量的值,以确保某一时刻测试条件为真,进而结束循环;
注:赋值不加$,比较要加$
例:写一个脚本,完成以下功能(使用函数):
1、提示用户输入一个可执行命令;
2、获取这个命令所依赖的全部库文件(使用ldd命令);
3、复制命令至/mnt/sysroot/对应的目录中
解释:假设,若是复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,若是复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;
4、复制各库文件至/mnt/sysroot/对应的目录中;
#!/bin/bash
#
target=/mnt/sysroot/
[ -d $target ] || mkdir $target
preCommand() {
if which $1 &> /dev/null; then
commandPath=`which--skip-alias $1`
return0
else
echo"No such command."
return1
fi
}
commandCopy() {
commandDir=`dirname $1`
[-d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
[-f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}
libCopy() {
for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
libDir=`dirname$lib`
[-d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[-f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
read -p "Plz enter a command: "command
until [ "$command" == 'quit' ];do
ifpreCommand $command &> /dev/null; then
commandCopy $commandPath
libCopy $commandPath
fi
read -p "Plz enter a command: " command
done
3、while循环:测试条件为真,进入循环。测试条件为假,退出循环。测试条件通常经过变量来描述,须要在循环体不断地改变变量的值,以确保某一时刻测试条件为假,进而结束循环。
1、while 测试条件;do
循环体
done
2、while循环:遍历文本文件
语法格式:
whileread 变量名;do
循环体
done </path/to/somefile
变量名,每循环一次,记忆文件中的一行
例题1:遍历文本文件
显示其ID号为偶数的用户的用户名、ID号和SHELL
#!/bin/bash
#
while read line; do
userID=`echo $line | cut -d: -f3`
if [ $[$userID%2] -eq 0 ];then
echo $line | cut -d: -f1,3,7
fi
done < /etc/passwd
例体2:显示ID号为偶数,且ID号同GID的用户的用户名、ID和SHELL;
while read line; do
userID=`echo$line | cut -d: -f3`
groupID=`echo$line | cut -d: -f4`
if[ $[$userID%2] -eq 0 -a $userID -eq $groupID ]; then
echo $line | cut -d: -f1,3,7
fi
done < /etc/passwd
例题3:复制一个数组中下标为偶数的元素至一个新数组中
#!/bin/bash
declare -a mylogs
logs=(/var/log/*.log)
echo ${logs[@]}
for i in `seq 0 ${#logs[@]}`; do
if [ $[$i%2] -eq 0 ];then
index=${#mylogs[@]}
mylogs[$index]=${logs[$i]}
fi
done
echo ${mylogs[@]}
例题4:生成10个随机数,升序排序
#!/bin/bash
#
declare -a arr
for i in {0..9};do
arr[$i]=$RANDOM
done
tmp=0
for i in {0..8};do
for j in `seq $i 9`;do
if [ ${arr[$i]} -gt ${arr[$j]} ];then
tmp=${arr[$i]}
arr[$i]=${arr[$j]}
arr[$j]=$tmp
fi
done
done
echo ${arr[@]}
例题5:打印九九乘法表
#!/bin/bash
#
for x in {1..9};do
for y in `seq 1 $x`;do
echo -ne"$x*$y=$[$x*$y]\t"
done
echo
done
呵呵,bash编程主体已经写完,你们也看出来了,下面一篇应该就是数组和bash的扩展知识了。要知数组是怎么样,请看下一篇。