谢烟客---------Linux之脚本编程---until,for,case

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

until循环

1
2
3
4
5
6
7
8
while CONDITION; do
condition-ture
done
为真时,进入循环
until CONDITION; do
循环体
done
为假时,进入循环


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

循环控制命令、语句:用于循环体中,用在条件判断的表达式上

1
2
3
4
5
6
continue [#]
默认当前"循环体",提前结束
# 提前结束#层循环体
break [#]
默认当前"循环",提前结束
# 提前结束#层循环


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

创建死循环(注意会耗尽cpu时钟周期的..)

1
2
3
4
5
6
while truedo
循环体
done
until falsedo
循环体
done


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

while遍历指定文件的每一行

1
2
3
while read line; do
循环体
done < /PATH/FROM/SOMEFILE

将行赋值给line变量

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C风格的for用法 

避免了for生成列表,会消耗大量的内存空间

1
2
3
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式)); do
循环体
done


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

条件判断case

1
2
3
4
5
6
7
8
9
10
11
12
case 变量引用 in
pattern)
statement
;;
pattern)
statement
;;
...
*)
statement
;;
esac

pattern支持 glob



until练习

示例:求100以内所有正整数和

示例:9x9

示例: 添加10个用户 user1-user10


continue、break练习

示例1:求100以内所有偶数之和,要求循环遍历100以内所有正整数

示例2:每3秒判断一次docker用户,如果docker用户登陆,则记录目志并退出循环


while遍历文件练习

示例:将ID号为偶数的所有用户,显示其用户的用户名


C风格的for用法 

示例: 9x9乘法表

练习:

1、显示菜单

cpu) show cpu infomation

mem) show memory information

disk) show disk information

quit) quit


2、提示用户选择选项

3、显示用户选择的内容


进一步地:

用户选择,并显示完成后不退出脚本,而是提示用户继续选择显示其它内容,直到使用quit退出


条件判断case

练习:

1)脚本可接受参数, start,stop,restart,status

2)非4者之一,提示使用格式并退出

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_NAME is running..."

/var/lock/subsys/SCRIPT_NAME文件不存在,则显示"SCRIPT_NAME is stopped..."


其中:SCRIPT_NAME为当前脚本名。$0


until练习

1、

1
2
3
4
5
6
7
8
9
10
示例:求100以内所有正整数和
#!/bin/bash
#
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ]; do
sum=$[$sum+$i]
let i++
done
echo "sum: $sum"

2、

1
2
3
4
5
6
7
8
9
10
11
12
13
示例:9x9
#!/bin/bash
#
declare -i i=1
until [ $i -gt 9 ]; do
declare -i j=1
until [ $j -gt $i ]; do
echo -n -e "${j}X${i}=$(expr $i \* $j)\t"
let j++
done
echo
let i++
done

3、

1
2
3
4
5
6
7
8
9
10
11
12
13
示例: 添加10个用户 user1-user10
#!/bin/bash
#
declare -i i=1
declare -i users=0
until [ $i -gt 10 ]; do
if ! id user$i &> /dev/null; then
useradd user$i
echo "Add user user$i finished"
let users+=1
fi
let i++
done


continue、break练习

1、

1
2
3
4
5
6
7
8
9
10
11
12
13
示例1:求100以内所有偶数之和,要求循环遍历100以内所有正整数
#!/bin/bash
#
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]; do
let i++
if [ $[$i%2] -eq 1 ]; then
continue
fi
let sum+=$i
done
echo "Even sum: $sum"

2、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
示例2:每3秒判断一次docker用户,如果docker用户登陆,则记录目志并退出循环
#!/bin/bash
#
if [ -z "$1" -o "$1" == "--help" ]; then
echo "Usage: $0 <username>"
exit 1
fi
if ! id $1 &> /dev/null; then
echo "$1 is not exist"
exit 2
fi
until falsedo
sleep 3
if who | grep "^$1\>" &> /dev/null; then
break
fi
done
echo "$1 login at $(date +%F_%T)" >> /tmp/user_login.log
判断: # bash -n a.sh
运行: # bash a.sh docker &


while遍历文件练习

1、

1
2
3
4
5
6
7
8
9
10
11
示例:将ID号为偶数的所有用户,显示其用户的用户名
#!/bin/bash
#
declare -i sum=0
while read line; do
if [ $[$(echo $line | cut -d':' -f3)%2] -eq 0 ]; then
echo -e "$(echo $line | cut -d':' -f1,3 --output-delimiter=' ')\t"
sum=$(($sum+1))
fi
done < /etc/passwd
echo "Even sum of users: $sum"

C风格的for用法 

1、

1
2
3
4
5
6
7
8
示例演示: 求100以内所有正整数之和
#!/bin/bash
#
declare -i sum=0
for ((i=1;i<=100;i++)); do
let sum+=$i
done
echo "sum: $sum"

2、

1
2
3
4
5
6
7
8
9
示例: 9x9乘法表
#!/bin/bash
#
for ((i=1;i<=9;i++)); do
for ((j=1;j<=i;j++)); do
echo -e -n "${j}X${i}=$[$i*$j]\t"
done
echo
done

3、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
练习:
1、显示菜单
cpu) show cpu infomation
mem) show memory information
disk) show disk information
quit) quit
2、提示用户选择选项
3、显示用户选择的内容
进一步地:
用户选择,并显示完成后不退出脚本,而是提示用户继续选择显示其它内容,直到使用quit退出
#!/bin/bash
#
while truedo
cat << EOF
cpu) show cpu infomation
mem) show memory information
disk) show disk information
quit) quit
EOF
read -p 'Enter a your choice: ' key
case $key in
cpu)
x86info
;;
mem)
vmstat -s
;;
disk)
fdisk -l /dev/[sh]d[a-z]
;;
quit)
exit 0
;;
*)
echo "only cpu | mem | disk | quit"
continue
;;
esac
done

条件判断case

1、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
练习:
1)脚本可接受参数, start,stop,restart,status
2)非4者之一,提示使用格式并退出
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_NAME is running..."
/var/lock/subsys/SCRIPT_NAME文件不存在,则显示"SCRIPT_NAME is stopped..."
其中:SCRIPT_NAME为当前脚本名。$0
#!/bin/bash
# chkconfig: - 88 12
# description: Lcc.org
#########################
SrvName=$(echo $0 | sed 's,/$,,' | sed -r 's|(.*/)([^/]+)|\2|')
Lockfile=/var/lock/subsys/$SrvName
#########################
unset Start Stop Restart Stauts Other
declare -i Start=1
declare -i Stop=1
declare -i Restart=1
declare -i Stauts=1
declare -i Other=1
case $1 in
start)
Start=0
;;
stop)
Stop=0
;;
restart)
Restart=0
;;
status)
Status=0
;;
*)
Other=0
;;
esac
if "$Start" == 0 ]; then
[ ! -e $Lockfile ] && touch $Lockfile
    echo "$0 start finished"
fi
if "$Stop" == 0 ]; then
[ -e $Lockfile ] && rm -rf $Lockfile
    echo "$0 stop finished"
fi
if "$Restart" == 0 ]; then
[ -e $Lockfile ] && rm -rf $Lockfile
    echo "$0 stop finished"
[ ! -e $Lockfile ] && touch $Lockfile
    echo "$0 start finished"
fi
if "$Status" == 0 ]; then
    [ -e $Lockfile ] && echo "$0 is running...." || echo "$0 is stopped..."
fi
if "$Other" == 0 ]; then
    echo "Usage:$0 {start|restart|stop|status}"
    exit 1
fi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
后续步骤
1、查看脚本语法
# bash -n x.sh
2、给予执行权限
# chmod +x x.sh
尝试加入服务
1、明确脚本是否遵循LSB风格
# chkconfig: - 88 12
# description: lcc.org 
2、复制至/etc/rc.d/init.d/目录中
# cp x.sh /etc/init.d/
3、加入服务中
# chkconfig --add x.sh
查看服务:
# chkconfig --list x.sh
    [root@localhost bin]# chkconfig --list x.sh
    x.sh           0:off1:off2:off3:off4:off5:off6:off
2345级别处于on状态
#  chkconfig --levels 2345 x.sh on
    [root@localhost bin]# chkconfig --list x.sh
        x.sh           0:off1:off2:on3:on4:on5:on6:off
1
2
3
4
5
测试用service控制
开启服务:service x.sh start
关闭服务: service x.sh stop
查看状态: service x.sh status
重启服务: service x.sh restart

谢烟客---------Linux之脚本编程---until,for,case










本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1964166,如需转载请自行联系原作者
上一篇:网页刷新方法集合


下一篇:linux脚本之 for循环方式