Shell Scripts
Shell Scripts
shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
shell script 的撰写中注意事项:
- 指令的执行是从上而下、从左而右的分析与执行;
- 指令的下达就如同第四章内提到的: 指令、选项与参数间的多个空白都会被忽略掉;
- 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空格键;
- 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
- 至于如果一行的内容太多,则可以使用『 [Enter] 』来延伸至下一行;
- 『 # 』可做为批注!任何加在 # 后面的资料将全部被视为批注文字而被忽略
#!/bin/bash #因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用bash 的语法
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0 #那么我们也可以利用 exit 这个指令来让程序中断,并且回传一个数值给系统
数值运算:简单的加减乘除
在数值运算上可以使用这种方法『 declare -i total=$ {firstnu}*$ {secnu} 』也可以使用这种方法var=$((运算内容)) 数值运算上的处理,则有:『+, -, *, /, %』。
利用 source 来执行脚本:在父程序中执行
- source showname.sh
利用 test 指令的测试功能
利用判断符号 [ ]
- 在中括号 [] 内的每个组件都需要有空格键来分隔;
- 在中括号内的变数,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来。
Shell script 的默认变数($0, $1...)
- $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
- $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
- $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字符,默认为空格键。
条件判断式
利用 if .... then
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
利用 case ..... esac 判断
case $变量名称 in <==关键词为 case ,还有变数前有钱字号
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac <==最终的 case 结尾!『反过来写』思考一下!
利用 function 功能
function fname() { #因为 shell script 的执行方式是由上而下,由左而右, 因此在 shell script当中的 function 的设定一定要在程序的最前面,
程序段 # function 也是拥有内建变量的~他的内建变量与 shell script 很类似, 函数名称代表示 $0 ,
而后续接的变量也是以 $1, $2... 来取代的~
}
循环 (loop)
while do done, until do done (不定循环)
#『当 condition 条件成立时,就进行循环,直到condition 的条件不成立才停止』
while [ condition ] <==中括号内的状态就是判断式
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束
#『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。』
until [ condition ]
循环的程序段。』
do
程序段落
done
for...do...done (固定循环)
for var in con1 con2 con3 ...
do
程序段
done
初始值:某个变量在循环当中的起始值,直接以类似 i=1 设定好;
限制值:当变量的值在这个限制值的范围内,就继续进行循环。例如 i<=100;
执行步阶:每作一次循环时,变量的变化量。例如 i=i+1。
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
shell script 的追踪与 debug
- sh [-nvx] scripts.sh
- 选项与参数:
- -n :不要执行 script,仅查询语法的问题;
- -v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
- -x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!
重点回顾
- shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面,搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的
- shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shellscripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。
- 在 Shell script 的文件中,指令的执行是从上而下、从左而右的分析与执行;
- shell script 的执行,至少需要有 r 的权限,若需要直接指令下达,则需要拥有 r 与 x 的权限;
- 良好的程序撰写习惯中,第一行要宣告 shell (#!/bin/bash) ,第二行以后则宣告程序用途、版本、作者等
- 对谈式脚本可用 read 指令达成;
- 要建立每次执行脚本都有不同结果的数据,可使用 date 指令利用日期达成;
- script 的执行若以 source 来执行时,代表在父程序的 bash 内执行之意!
- 若需要进行判断式,可使用 test 或中括号 ( [] ) 来处理;
- 在 script 内,$0, $1, $2..., $@ 是有特殊意义的!
- 条件判断式可使用 if...then 来判断,若是固定变量内容的情况下,可使用 case $var in ... esac 来处理
- 循环主要分为不定循环 (while, until) 以及固定循环 (for) ,配合 do, done 来达成所需任务!
- 我们可使用 sh -x script.sh 来进行程序的 debug