Mark blog

知行合一 划水归档

Linux shell 脚本编程进阶(一)

Shell 脚本也是学习Linux中必须要掌握的基础之一,掌握了 Shell 脚本之后可以轻松控制自动化及重复的任务,大大减少重复的劳动.

流程控制

过程式编程语言:

顺序执行 

​ 选择执行

循环执行 

条件选择 if 语句

选择执行:

注意:if语句可嵌套

单分支

if 判断条件;then 

    条件为真的分支代码 

fi 

双分支

if 判断条件; then 

    条件为真的分支代码 

else 

    条件为假的分支代码 

fi 
if语句

多分支

if 判断条件1; then 

    条件1为真的分支代码 

elif 判断条件2; then 

    条件2为真的分支代码 

​ elif 判断条件3; then

    条件3为真的分支代码 

else 

    以上条件都为假的分支代码 

fi 

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

if示例

根据命令的退出状态来执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if ping -c1 -W2 station1 &> /dev/null; then 

echo 'Station1 is UP'

elif grep "station1" ~/maintenance.txt &> /dev/null; then

echo 'Station1 is undergoing maintenance‘

else

echo 'Station1 is unexpectedly DOWN!'

exit 1

fi

条件判断 case 语句

case 变量引用 in

PAT1)

分支1 

;; 

PAT2)

分支2 

;; 

*)

默认分支 

;; 

esac

case支持glob风格的通配符:

*: 任意长度任意字符 

​ ?: 任意单个字符

[]:指定范围内的任意单个字符 

a|b: a或b 

循环

循环执行

将某代码段重复运行多次 

重复运行多少次 

    循环次数事先已知 

    循环次数事先未知 

有进入条件和退出条件 

for, while, until

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层

1
2
3
4
5
6
7
8
9
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
循环控制语句break

用于循环体中
break [N]:提前结束第N层循环,最内层为第1层

1
2
3
4
5
6
7
8
9
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
循环控制shift命令

shift [n]
用于将参量列表 list 左移指定次数,缺省为左移一次.
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除.while 循环遍
历位置参量列表时,常用到 shift
./doit.sh a b c d e f g h

./shfit.sh a b c d e f g h

命令示例

doit.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
# Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done

shift.sh

1
2
3
4
5
6
7
8
#!/bin/bash
#step through all the positional parameters
until [ -z "$1" ]
do
echo "$1"
shift
done
echo
创建无限循环
1
2
3
while true; do
循环体
done
1
2
3
until false; do
循环体
Done
循环的特殊用法

while循环的特殊用法(遍历文件的每一行):

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

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

双小括号方法,即((…))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作
I=10
((I++))

for循环的特殊格式:

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

控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

select循环与菜单
1
2
3
4
select variable in list
do
循环体命令
done

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在
标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中

select与case

select 是个无限循环,因此要记住用 break 命令退出循环,或用
exit 命令终止脚本.也可以按 ctrl+c 退出循环
select 经常和 case 联合使用
与 for 循环类似,可以省略 in list,此时使用位置参量