学习shell script
编写shell script
- shell script的功能:
(1)自动化管理的重要依据
(2)追踪与管理系统的重要工作
(3)简单入侵检测功能
(4)连续命令单一化
(5)简易的数据处理
(6)跨平台支持与学习历程较短 - shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,就不够好了,因为shell script的速度较慢,且使用的cpu资源较多,造成主机资源的分配不良。
- shell script中的命令执行是从上而下、从左到右地分析与执行,命令、参数间的多个空白都会被忽略掉,空白行也会被忽略掉
- 当直接命令执行时,shell script文件必须要具备可读和可执行(rx)的权限,而当以bash进程执行时,脚本文件只需要有r的权限即可。
#!/bin/bash
语句声明这个script使用的shell名称,当这个程序被执行时,能够加载bash的相关环境配置文件- 我们可以使用
var=$((运算内容))
的方式来进行运算代替使用declare
命令声明变量类型 - 当采用直接执行的方式来执行script时,当子进程内的各项变量或操作将会结束而不会传回到父进程中。而采用
source
命令执行脚本时子进程的各项操作会在原本的bash中生效。
判断式
- 利用
test
命令的测试功能
-e
:该文件名是否存在
-f
:该文件名是否存在且为文件
-d
:该文件名是否存在且为目录
!
:反向状态,当条件不成立时才返回true - 利用判断符号
[]
,使用中括号作为shell的判断式时,必须要注意中括号的两端需要有空格符来分割,中括号内的变量,最好都以双引号括起来,在中括号内的常量最好都以单引或双引号括号起来 - script针对参数有一些设置好的变量名称,执行的脚本文件名为
$0
这个变量,第一个接的参数就是$1
,以此类推。除了数字变量,还有一些较为特殊的变量可以在script中使用来调用这些参数:
$#
:代表后接的参数个数
$@
:代表$0
、$1
等全部变量
$*
:代表$0c$1
等全部变量,c为分隔字符,默认为空格键
shift
操作会造成参数变量号码偏移,shift
后面可以接数字,代表拿掉最前面几个参数的意思
条件判断式
if...then
语句可以完成单层、简单逻辑判断式,在这样的语句中,&&
代表and,||
代表or,fi
用于结束if
语句,更复杂、多层的条件判断式则可以使用if...then elif...then...else
语句netstat
命令可以查询到目前主机打开的网络服务端口- 针对多个既定的变量内容,我们可以使用
case...in...esac
语句,每个变量内容建议用双引号括起来,关键字则为小括号,每一个变量内容的程序段最后都需要两个分号;;
来代表该程序段落的结束。最后的*
变量内容代表之前设置的变量内容都不匹配时执行的默认操作 - 一般使用“case $变量 in”的语法,当中的那个“$变量”大致有两种取得的方式:
(1)直接执行式,使用script.sh variable
的方式来直接给与$1
这个变量的内容
(2)交互式,通过read
命令来让用户输入变量的内容 - shell script的执行方式是由上而下、由左到右,因此在shell script当中的
function
的设置一定要在程序的最前面,这样才能够在执行时被找到可用的程序段 function
也是拥有内置变量的,它的内置变量与shell script很类似,函数名称代表是$0
,而后续接的变量也是以$1,$2...
来替代的。
循环
- 不定循环的两种方式:
while do done
以及until do done
while [condtion] #判断式 do #循环的开始 程序段落 done #循环结束
当condition条件成立时,就进行循环,直到condition的条件不成立才停止
until do done
until [condition] do 程序段落 done
与while语句相反,当condition条件成立时,就终止循环,否则就持续进行循环的程序段。
- 固定循环
for...do..done
,它的一种语法是for var in con1,con2,con3... do 程序段 done
for...do..done
用于数值处理时它的另外一种语法是for ((初始值;限制值;执行步长)) do 程序段 done
初始值:某个变量在循环当中的初始值
限制值:当变量的值在这个限制值的范围内,就继续进行循环
执行步长:每做一次循环时变量的变化量- shell script的追踪与调试,我们可以直接以bash的相关参数进行判断
sh [-nvx] scripts.sh -n: 不要执行script,仅查询语法的问题 -v: 在执行script之前,先将script的内容输出到屏幕上 -x:将使用到的script内容显示到屏幕上