一、for循环
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名” ; 每次赋值后即执
行一次循环体; 直到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob, 如: *.sh
(5) 变量引用;
$@, $*
二、while循环
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之
后会再次做判断;条件为“ true”,则执行一次循环;直到条件测试
状态为“ false”终止循环
因此: CONDTION一般应该有循环控制变量;而此变量的值
会在循环体不断地被修正
进入条件: CONDITION为true;
退出条件: CONDITION为false
三、until循环
until CONDITION; do
循环体
done
进入条件: CONDITION 为false
退出条件: CONDITION 为true
四、循环控制语句continue
用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一
轮判断;最内层为第1层
while CONDTIITON1; do
CMD1
…
if CONDITION2 ;then
continue
fi
CMDn
…
done
五、循环控制语句break
用于循环体中
break [N]:提前结束第N层循环, 最内层为第1层
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi
CMDn
…
done
作业:
1、使用循环语句,写个脚本实现:
*
***
*******
*********
#!/bin/bash
#
read -p "input line number:" line
declare -i n=1
declare -i lie=1
while [ $n -le "$line" ];do
kong_number=$[$line-$n]
xing_number=$[1+2*($n-1)]
xing_start=$[$line-$n+1]
xing_end=$[$kong_number+$xing_number]
sum_lie=$[2*$kong_number+$xing_number]
declare -i lie=1
while [ "$lie" -le "$sum_lie" ];do
if [ "$lie" -ge "$xing_start" ] && [ "$lie" -le "$xing_end" ];then
echo -ne "\033[41m*\033[0m"
else
echo -ne "\033[31;45m \033[0m"
fi
let lie++
done
let n++
echo
done
~
2、用until循环实现国际象棋棋盘
#!/bin/bash
#print the chessboard
declare -i H=1
declare -i S=1
white="\033[1;41m \033[0m"
black="\033[1;47m \033[0m"
until [ $S -eq 9 ];do
Syu=$[$S%2]
if [ "$Syu" -eq 1 ]; then
while [ $H -le 8 ];do
yu=$[$H%2]
[ $yu -eq 0 ] && echo -ne "$white" || echo -ne "$black"
let H++
done
else
until [ $H -eq 9 ];do
yu=$[$H%2]
[ $yu -eq 0 ] && echo -ne "$black" || echo -ne "$white"
let H++
done
fi
declare -i H=1
let S++
echo
done
8-19 作业:
1、1、编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”
其中:SCRIPT_NAME为当前脚本名
1 #!/bin/bash
2 #
3 PS3="input your chioce:"
4 select menu in start stop restart status
5 do
6 case $REPLY in
7 start)
8 find /var/lock/subsys/testsrv.sh &> /dev/null
9 if [ $? -eq 0 ] ;then
10 echo "file exist"
11 else
12 touch /var/lock/subsys/testsrv.sh
13 echo "file create successful"
14 fi
15 ;;
16 stop)
17 rm /var/lock/subsys/testsrv.sh &> /dev/null
18 [ $? -eq 0 ] && echo "停止完成" || echo "已经停止,无需重> 复"
19 ;;
20
21 restart)
22 rm -f /var/lock/subsys/testsrv.sh &> /dev/null
23 touch /var/lock/subsys/testsrv.sh
24 echo "restart successfully"
25 ;;
26
27 status)
28 find /var/lock/subsys/testsrv.sh
29 [ $? -eq 0 ] && echo "testsrv.sh running…" || echo "testsrv. sh is stopped.."
30 ;;
31 *)
32 echo "error" ;break
2、编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称;
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:
如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出
#!/bin/bash
while true ;do
read -p "please input cmd:" cmd
if [[ "$cm" == "quit" ]];then
echo "exiting"
exit
else
cmd_path=`whereis $cmd | cut -d ' ' -f2`
cmd_lib_list=`ldd $cmd_path`
cp -a $cmd_path /tmp/test/temp_cp_dir
[ $? -eq 0 ] && echo "cp file successful" || echo "cp file error"
for i in cmd_lib_list;do
cp -a $i /tmp/test/temp_cp_dir
[ $? -eq 0 ] && echo "cp $i successful" || echo "cp lib $i error"
done
echo "cp $cmd successful"
fi
done
原创文章,作者:ldt195175108,如若转载,请注明出处:http://www.178linux.com/37442