谢烟客---------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  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

wKiom1m1KrziL2B5AAAdLpFJJvs717.png










本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1964166,如需转载请自行联系原作者
目录
相关文章
|
22天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
77 1
|
25天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
26 1
|
28天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
28天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
202 0
|
28天前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
34 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
28天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
37 0
|
28天前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
40 0
|
1天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
7 0
|
15天前
|
Linux 开发者
Linux文件编程(open read write close函数)
通过这些函数,开发者可以在Linux环境下进行文件的读取、写入和管理。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
84 4