基本上,shell script 有点像早期的批处理程序,即将一些命令汇整起来一次执行,但shell script拥有更强大的功能,他可以进行类似程序(program)的编写,并且不需要经过编译(compile)就能执行,真的很方便。
1、什么是shell script
shell,就是一个命令行界面下面让我们与系统沟通的一个工具接口;script,字面上script是脚本的意思。换句话说,shell script是针对shell所写的脚本。
shell script是利用shell的功能所能写的一个程序(program),这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、命令管道与数据流重定向等功能,还提供了数组、循环、条件与逻辑判断等重要功能, 以达到我们所想要的处理目的。
shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,就不够好了,因为shell script的速度较慢,且使用的cpu资源较多,造成主机资源的分配不良。
使用shell script优势:
自动化管理的重要依据;
追踪与管理系统的重要工具;
简单入侵检测功能;
连续命令单一化;
简单的数据处理;
跨平台支持与学习历程较短;
shell script的编写中的注意事项:
命令的执行是从上到下,从左到右分析与执行;
命令的执行中:命令、参数间的多个空白都会被忽略掉;
空白行也将被忽略,并且[tab]按键所得的空白同样视为空格键;
如果读取到一个Enter符号(CR),就尝试开始执行该行命令;
如果一行内容太多,则可以使用“\[Enter]"来扩展到下一行;
"#"可以作为注释,任何加在#后面的内容都将被视为注释而被忽略。
shell script文件的执行方式:
直接命令执行:xxx.sh文件必须具有可读(r)和可执行(x)权限,然后使用 绝对路径 或 相对路径 来执行命令;
以bash进程来执行: bash xxx.sh;
script执行方式的区别:source、shscript、./script
利用直接执行的方式来执行script;使用这种执行方式时,script是在子进程的bash内执行的,当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程中。
利用source来执行脚本:在父进程中执行
编写第一个script:
#!/bin/bash #声明script使用的shell
#program: #程序内容说明
# This program shows "Hello World!" in your screen.
#History:
#2017.04.24 Zhang First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin #主要环境变量的声明
export PATH
echo -e "Hello World !\n" #主要程序部分
exit 0 #告知执行结果
良好的script编写习惯,在每个scripted的文件头处记录好:
script的功能;
script的版本信息;
script的作者;
script的版权声明方式;
script的History(历史记录);
script内较特殊的命令,使用“绝对路径”的方式来执行;
script执行时需要的环境变量预先声明与设置。
在较为特殊的程序代码部分,建议务必要加上批注说明。
利用test命令的测试功能:
当我要检测系统上某些文件或者是相关属性时,利用test这个命令来工作真是太好了。
test -e /abc.txt && echo "exist" || echo "Not exist"
利用判断符号[ ]:
如果需要在bash中使用中括号来作为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔;
中括号内的变量,每个最好都已双引号括起来;
中括号内的常量,最好都以单或双引号括起来。
shell script的默认变量:$0,$1...
script是如何实现这个功能的呢?其实script针对参数已经有设置好一些变量名称了!
执行文件的脚本名就是$0,第一个接的参数就是$1。所以,只要在script里面善用$1的话,就可以很简单地立即执行某些命令功能。
$#:代表后接的参数“个数”;
$@:代表“$1","$2","$3"之意,每个变量是独立的(用双引号括起来);
$*:代表“$1c$2c$3c”,其中c为分割字符,默认为空格键,即为“$1 $2 $3"之意。
shift:造成参数变量号码偏移
shift会移动变量,而且shift后面可以接数字,代表拿掉最前面的几个参数的意思。
条件判断式
1、if...then
if...then 是最常见的条件判断式。简单地说,就是当符合某个条件判断的时候,就进行某项工作。
单层、简单条件判断式:
&&代表and;
|| 代表or;
if [条件判断式];then
当条件判断式成立时,可以进行的命令工作内容;
fi #结束 if
多重、复杂条件判断式:
if [条件判断式];then
xxxx
else
xxxx
fi
if [condition1];then
xxxx
elif [condition2];then
xxxx
else
xxxx
fi
2、case...esac判断
有多个既定变量内容,那么只需要针对这几个变量来设置状况就好了。
case $变量名称 in
"第一个变量内容“)
xxxx
;; #表示该程序段落的结束
”第二个变量内容“)
xxxx
;;
*)
xxxx
;;
esac #表示结束case判断
其实系统的很多服务的启动script都是使用这种写法的。如/etc/init.d/networ
/etc/init.d/network #这样是交互式
用法:/etc/init.d/network {start|stop|status|restart|reload|force-reload}
/etc/init.d/network status #这样是直接执行式
3、function功能
什么是function(函数)功能?简单地说,其实,函数可以在shell script 当中做出一个类似自定义执行命令的东西,最大的动能是,可以简化我们很多的程序代码。
function fname() {
程序段
}
要注意的是,因为shell script的执行方式是由上而下、由左而右,因此在shell script当中的function的设置一定要在程序的最前面,这样才能够在执行时被找到可用的程序段。它不但可以简化程序代码,而且可以做成类似模块的玩意儿,真的很不错!
#!/bin/bash
#Program:
# Use function to repeat information.
#History:
#20170425 zhang21_
function printit() {
echo -n "Your choice is " #-n表示不断行显示
}
echo "This program will print your selection !"
case $1 in
"one")
printit; echo $1 | tr 'a-z' 'A-Z' #将输出小写转换为大写
;;
"two")
printit 2
;;
*)
echo "Usage $0 {one|two}"
;;
esac
循环(loop)
1、while do done, until do done(不定循环)
while [ condition 1 ]
do
程序段落
done
while 是当 condition条件成立时,就进行循环,知道condition的条件不成立才停止。
until 是当condition条件成立时,就终止循环,否则就持续进行循环的循环。两者刚好相反。
until [ condition 2 ]
do
程序段落
done
2、for do done(固定循环)
for xxx in con1 con2 con3 ...
do
程序段
done
for do done 的数值处理:
for ((初始值;限制值;执行步长))
do
程序段
done
初始值:某个变量在循环当中的初始值,直接以类似 i=1 设置好;
限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如 i<=100;
执行步长:每做一次循环时变量的变化量,如 i=i+1
[root@www scripts]#vi sh19.sh#!/bin/bash
# Program:
# Try do calculate 1+2+....+${your_input}
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -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的追踪与调试
script在执行之前,最怕的就是出现语法错误的问题了!那么我们如何调试呢?
至于在shell script的学习方法上面,需要多看、多模仿并加以修改成自己的样式!这是最快的学习手段!
重点回顾:
shell script是利用shell的功能所写的一个”程序(program)”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的;
shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上就不够好了,因为shell script的速度较慢,且使用的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 来进行程序的调试。