引:要想管理好自己的主机,自动化管理系统的好工具——shell script,这个家伙是真的需要好好学习学习的!
什么是shell script
shell script 是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式,管道命令与数据重定向等功能,以达到我们所想要的处理目的。
为什么要学习shell script
- 自动化管理的重要依据
- 追踪与管理系统的重要工作
- 简单入侵检测功能
- 连续命令单一化
- 简易的数据处理
- 跨平台与学习历程较短
shell script编写的注意事项
- 命令的执行是从上而下,从左往右地分析与执行;
- 命令、参数间的多个空白都会被忽视掉;
- 空白行也将被忽略掉,并且tab按键所得的空白同样视为空格键;
- 如果读到一个enter符号(CR),就尝试开始结束该行(或该串)命令
- 至于如果一行的内容太多,则可以使用“\enter”来扩展至下一行;
- “#”可作为批注,任何加在#后面的数据将全部被视为批注文件而被忽略。
shell script的执行
假设你的程序文件名是/home/rex/shell.sh
- 直接执行命令:shell.sh文件必须具备可读可执行(rx)的权限,然后:
- 绝对路径:使用/home/rex/shell.sh
- 相对路径:假设工作目录在/home/rex/,则使用./shell.sh来执行
- 变量“PATH”功能:将shell.sh放在PATH指定的目录内,例如:~/bin/。
- 以bash进程来执行:通过“bash shell.sh”或“sh shell.sh”来执行
- 利用source来执行:这样这个脚本将在父进程中执行,各项操作都会在原本的bash内生效。如果直接执行,script是在子进程中的bash内执行的,当子进程完成后,子进程的各项变量或操作将会结束而不会传回到父进程中。
良好的 script 撰写习惯
在每个 script 的档头处记录好:
- script 的功能;
- script 的版本资讯;
- script 的作者与联络方式;
- script 的版权宣告方式;
- script 的 History (历史纪录);
6。script 内较特殊的命令,使用绝对路径的方式来下达; - script 运行时需要的环境变量预先宣告与配置。
Hello Word程序
1 | #!/bin/bash // 声明这个script使用的shell名称 |
善用判断式
利用test命令的测试功能
如下面的例子,用于检测文件夹是否存在:1
test -e /dmtsai && echo "exist" || echo "Not exist"
利用判断符号[]
如果我想要知道 $HOME 这个变量是否为空的,可以这样做:1
[ -z "$HOME" ] ; echo $?
对于判断符号我们一定要注意:
- 在中括号 [] 内的每个组件都需要有空白键来分隔;
- 在中括号内的变量,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来。
shell script 的默认变量($0, $1…)
运行的脚本档名为 $0 变量,第一个接的参数就是 $1,依次类推。其他特殊变量:
- $# :代表后接的参数个数;
- $@ :代表”$1” “$2” “$3” “$4” …之意,每个变量是独立的(用双引号括起来);
- $* :代表『”$1c$2c$3c$4…” ,其中 c 为分隔字节,默认为空白键。
条件判断式
利用 if …. then
如下面的代码:1
2
3
4
5
6
7if [ "$1" == "hello" ]; then
echo "Hello, how are you ?"
elif [ "$1" == "" ]; then
echo "You MUST input parameters, ex> {$0 someword}"
else
echo "The only parameter is 'hello', ex> {$0 hello}"
fi
利用 case ….. esac 判断
如下面的代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14case $1 in
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
利用 function 功能
如下面的代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19function printit(){
echo "Your choice is $1" # 这个 $1 必须要参考底下命令的下达
}
echo "This program will print your selection !"
case $1 in
"one")
printit 1 # 请注意, printit 命令后面还有接参数!
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
循环(loop)
while do done, until do done (不定次数循环)
如下面的代码:1
2
3
4
5
6
7
8
9while [ condition ] <==中括号内的状态就是判断式
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束
until [ condition ]
do
程序段落
done
for…do…done (固定次数循环)
如下面的代码:1
2
3
4for var in con1 con2 con3 ...
do
程序段
done
for…do…done 的数值处理
如下面的代码:1
2
3
4
5
6
7
8read -p "Please input a number, I will count for 1+2+...+your_input: " nu
s=0
for (( i=1; i<=$nu; i=i+1 ))
do
s=$(($s+$i))
done
echo "The result of '1+2+3+...+$nu' is ==> $s"
shell script 的追踪与调试
可以使用下面的命令:1
2
3
4
5
6sh [-nvx] scripts.sh
选项与参数:
-n :不要运行 script,仅查询语法的问题;
-v :在运行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到萤幕上,这是很有用的参数!
参考
- 《鸟哥的Linux私房菜》