++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 true ; do
循环体 done until false ; do
循环体 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 false ; do
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 true ; do
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 |