++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
|