一、相关概念
1. 什么是Shell scripts
-
是利用 shell 的功能所写的一个“程序 (program)”,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式、管线命令与数据流重导向等功能,以达到我们所想要的处理目的;
2. Shell scripts的作用
-
自动化管理的重要依据;
-
追踪与管理系统的重要工作;
-
简单入侵侦测功能;
-
连续指令单一化;
-
简单的数据处理;
-
跨平台支持与学习历程较短;
3. 注意事项
-
指令的执行是从上而下、从左而右的分析与执行;
-
指令、选项与参数间的多个空白都会被忽略掉;
-
空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
-
如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
-
至于如果一行的内容太多,则可以使用“ [Enter] ”来延伸至下一行;
-
“ # ”可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略;
4. 执行方法
-
直接指令下达(需要有rx权限):绝对路径/home/root/shell.sh、相对路径./shell.sh;
-
以bash程序来执行:bash shell.sh或sh shell.sh;
5. 编写习惯
-
script的功能;
-
script的版本信息;
-
script 的作者与联络方式;
-
script 的版权宣告方式;
-
script 的 History (历史纪录);
-
script 内较特殊的指令,使用“绝对路径”的方式来下达;
-
script 运行时需要的环境变量预先宣告与设置。
二、script相关语法
1. script执行方式的差异
-
利用直接执行的方式执行script:使用绝对路径、相对路径、${PATH}内、bash或sh下执行都是在子程序中执行的,执行完后所有的数据便被移除;
-
利用source来执行script:会在父程序当中执行;
2. 判断式
-
利用test指令的测试功能
测试的标志 代表意义 1. 关于某个文件名的“文件类型”判断 -e 该“文件名”是否存在?(常用) -f 该“文件名”是否存在且为文件(file)?(常用) -d 该“文件名”是否存在且为目录(directory)?(常用) -b 该“文件名”是否存在且为一个 block device 设备? -c 该“文件名”是否存在且为一个 character device 设备? -S 该“文件名”是否存在且为一个 Socket 文件? -p 该“文件名”是否存在且为一个 FIFO (pipe) 文件? -L 该“文件名”是否存在且为一个链接文件? 2. 关于文件的权限侦测 -r 侦测该文件名是否存在且具有“可读”的权限? -w 侦测该文件名是否存在且具有“可写”的权限? -x 侦测该文件名是否存在且具有“可执行”的权限? -u 侦测该文件名是否存在且具有“SUID”的属性? -g 侦测该文件名是否存在且具有“SGID”的属性? -k 侦测该文件名是否存在且具有“Sticky bit”的属性? -s 侦测该文件名是否存在且为“非空白文件”? 3. 两个文件之间的比较 -nt (newer than)判断 file1 是否比 file2 新 -ot (older than)判断 file1 是否比 file2 旧 -ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode 哩! 4. 关于两个整数之间的判定 -eq 两数值相等 (equal) -ne 两数值不等 (not equal) -gt n1 大于 n2 (greater than) -lt n1 小于 n2 (less than) -ge n1 大于等于 n2 (greater than or equal) -le n1 小于等于 n2 (less than or equal) 5. 判定字串的数据 test -z string 判定字串是否为 0 ?若 string 为空字串,则为 true test -n string 判定字串是否非为 0 ?若 string 为空字串,则为 false。 -n 亦可省略 test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false 6. 多重条件判定 -a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。 -o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。 ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true -
判断符号[]
-
在中括号 [] 内的每个元件都需要有空白键来分隔;
-
在中括号内的变量,最好都以双引号括号起来;
-
在中括号内的常数,最好都以单或双引号括号起来;
-
-
默认变量
-
$# :代表后接的参数“个数”,以上表为例这里显示为“ 4 ”;
-
$@ :代表“ "$1" "$2" "$3" "$4" ”之意,每个变量是独立的(用双引号括起来);
-
$* :代表“ "$1c$2c$3c$4" ”,其中 c 为分隔字符,默认为空白键, 所以本例中代表“ "$1 $2 $3 $4" ”之意;
-
shift:shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思;
-
3. 条件判断式
-
if...then
-
单层、简单条件判断式
if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的指令工作内容; fi <==将 if 反过来写,结束 if 之意
-
多重、复杂条件判断式
# 一个条件判断,分成功进行与失败进行 (else) if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的指令工作内容; else 当条件判断式不成立时,可以进行的指令工作内容; fi
# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行 if [ 条件判断式一 ]; then 当条件判断式一成立时,可以进行的指令工作内容; elif [ 条件判断式二 ]; then 当条件判断式二成立时,可以进行的指令工作内容; else 当条件判断式一与二均不成立时,可以进行的指令工作内容; fi
-
-
case...esac
case $变量名称 in <==关键字为 case ,还有变量前有钱字号 "第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 ) 程序段 ;; <==每个类别结尾使用两个连续的分号来处理! "第二个变量内容") 程序段 ;; *) <==最后一个变量内容都会用 * 来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序执行段 exit 1 ;; esac <==最终的 case 结尾
4. function功能
-
在 shell script 当中的 function 的设置一定要在程序的最前面;
-
function 拥有内置变量,他的内置变量与 shell script 很类似, 函数名称代表示 $0 ,而后续接的变量也是以 $1, $2... 来取代;
function fname() { 程序段 }
5. 循环
-
while do done,until do done
while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是循环的结束
until [ condition ] do 程序段落 done
-
for...do...done
for var in con1 con2 con3 ... do 程序段 done
for (( 初始值; 限制值; 执行步阶 )) do 程序段 done
6. shell script的追踪与debug
sh [-nvx] scripts.sh 选项与参数: -n:不要执行 script,仅查询语法的问题; -v:再执行 sccript 前,先将 scripts 的内容输出到屏幕上; -x:将使用到的 script 内容显示到屏幕上,这是很有用的参数;