Shell Scripts
简单脚本编写
对谈式脚本
通过之前提到的read指令,可以实现读取键盘的输入,对谈式脚本便可以用这个指令来实现。
日期相关脚本
简单数据相加减乘除
脚本执行方式差异
不同的脚本执行方式会导致不一样的结果,尤其是bash的环境影响。
直接执行
利用 sh 脚本名 的方式进行脚本的执行,之前也提过在脚本中定义的变量并不能在bash环境下运用。
因为用直接执行的方式来处理脚本,系统会给一支新的bash来运行脚本,在脚本执行完毕后,子程序bash内的所有数据都被移除,所以我们无法在bash环境中再次调用申明的变量。
source
运用source可以让脚本在父程序中运行。
善用判断式
test
下表内容也可以用help指令获取。
测试标志 | 含义 |
---|---|
档名类型的判断 | |
-e | 档名是否存在 |
-f | 档名是否存在且为文件 |
-d | 档名是否存在且为目录 |
-b | 该档名是否存在且为一个block device装置 |
文件权限判断 | |
-r | 该档名是否存在且具有『可读』的权限? |
-w | 该档名是否存在且具有『可写』的权限? |
-x | 该档名是否存在且具有『可执行』的权限? |
-u | 该文件名是否存在且具有『SUID』的属性? |
-g | 该文件名是否存在且具有『SGID』的属性? |
-k | 该文件名是否存在且具有『Sticky bit』的属性? |
-s | 该档名是否存在且为『非空白文件』 |
两个文件之间比较 | |
-nt | (newer than)判断 file1 是否比 file2 新 |
-ot | (older than)判断 file1 是否比 file2 旧 |
[ ]
运用时需要注意以下几点:
- 在中括号 [] 内的每个组件都需要有空格键来分隔;
- 在中括号内的变数,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来。
shell script的默认变数
- $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
- $@ :代表『 “$1” “$2” “$3” “$4” 』之意,每个变量是独立的(用双引号括起来);
- $* :代表『 “$1c$2c$3c$4” 』,其中 c 为分隔字符,默认为空格键, 所以本例中代表『 “$1 $2 $3 $4” 』之意。
- $0: 代表执行该脚本的档名,后跟其余数字为执行脚本时的参数
条件判断式
if then
这里和c类似
单层、简单条件判断语句
if [ 条件判断式 ]; then
fi
这里的fi并没有写反,意思是结束if的条件判断。
多重、复杂条件判断式
类似
if [ 条件判断式一 ]; then
elif [ 条件判断式二 ]; then
else
fi
case esac
case $变量名称 in
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其他值
程序段
exit 1
;;
esac
function 功能
类似于c语言的函数,不同是:
- shell script 的执行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的设定一定要在程序的最前面。(C只要声明了就无关位置)
当然了,function也可以拥有参数,用法与shell script的参数传递类似,下面放一个鸟哥书上的例子:
function 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
鸟哥的书把function放在了条件判断里面,个人感觉不是那么的严谨,不过问题不大。
循环语句
while do done, until do done
一种是while do done,和C中的while相同。
while [ condition ]
do
程序段落
done
另一种是until do done,恰好和while相反。
until [ condition ]
do
程序段落
done
for do done
for var in con1 con2 con3 ...
do
程序段
done
每次循环var的值都被替换为下一个状态(con1到conN)
for do done
这个和上一个比起来就更像是C了
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
shell script的追踪和debug
sh [-nvx] scripts.sh
选项 | 作用 |
---|---|
-n | 不要执行 script,仅查询语法的问题 |
-v | 再执行 sccript 前,先将 scripts 的内容输出到屏幕上 |
-x | 将使用到的 script 内容显示到屏幕上,这是很有用的参数 |