Shell Scripts
什么是shell Scripts
字面了解为针对shell所写的脚本,即利用shell的功能所写的一个程序,该程序使用纯文本文件,其包括shell的语法与指令,搭配正则表达式、管道命令与数据流重定向等功能,已达到理想的处理目的。shell Script在处理数据的速度上不占优势,因为shell scrpit用的是外部的指令与bash shell的一些默认工具,在使用时,通常会转到外部的函数库中执行,因此,相比传统的程序语言,其速度不快。shell script在系统管理上是一项很好的工具,但不能够用于处理大量的数值运算,一则速度慢,二则占用cpu资源较多,会造成主机资源的分配不良。
编写shell script
#!/bin/bash #program: # This program show "Hello World!"in your screen. #History: #2019/08/13 aaron First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Hello World! \a \n" exit 0
第一行#!/bin/bash 表示该script所使用的shell名称,终端默认使用的是bash shell
其余以#开头的都是注释信息
PATH为bash shell的环境变量,通过添加路径,可以直接在命令行执行.sh文件
利用date命令 建立文件,该文件名的名称随日期变化
#History: #2019/08/13 aaron First release PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:~/bin export PATH echo -e "I will use 'touch' command to create 3 files." read -p "Please input your filename: " filename filename=${fileuser:-"filename"} date1=$(date --date='2 days ago' +%Y%m%d) date2=$(date --date='1 days ago' +%Y%m%d) date3=$(date +%Y%m%d) file1=${filename}${date1} file2=${filename}${date2} file3=${filename}${date3} touch "${file1}" touch "${file2}" touch "${file3}" exit 0
在编写script时尤其要注意语句的间隔符,多了没事(会当作1个空格符),少了则不符合语句规则
小指令:$(command)
var=$((运算内容))
算数高级运算指令bc
script的执行方式差异
执行方式:source、sh script、./script
直接执行方式:该执行方式会使用一个新非bash环境来执行脚本内的指令,即script是在子程序的bash内执行的,script内建立的本地变量不会传到父程序中
source执行方式:该执行方式是在父程序中执行,各项动作都会在源bash中生效
判断
test命令(并不会直接显示结果,可以通过echo $?来查看,如果是0表示存在,1表示不存在)
test -e filesname filename是否存在
test -f filename filename是否为普通文件
test -d filename filename是否为文件夹
test -b filename filename是否为block device装置
test -c filename filename是否为character device装置
test -s filename filename是否存在且为非空文件
test -r filename filename是否具有可读权限
test -w filename filename是否具有可写权限
test -x filename filename是否具有可执行权限
test file1 -nt file2 判断file1是否比file2新
test file1 -ot file2 判断file1是否比file2旧
test file1 -ef file2 判断file1与file2是否为同一个文件,即指向同一个inode
只列出一小部分test相关的操作
[]判断
用法:使用方法与test 一模一样,只是[]常用在if……then……fi中
注意事项:[]在进行判断是其内部两端需要有空格;
在[]中的内阁组件都余姚有空格来分隔;
在[]中的变量,最好用双引号引起来;
在[]中的常量,最好都以单引号或双引号括起来。
shell script的默认变量
script脚本 restart 表示重新启动这script脚本
script脚本 stop 关闭该服务
带参数的script脚本
命令行:script名 参数1 参数2 参数3
$0 $1 $2 $3
特殊变量:$# 表示命令后有几个参数
$@ 表示“$1” “$2” “$3” “$4” 即将每个变量用双引号括起来
$* 表示“$1c$2c$3c$4” c表示分隔符(默认为空格)
shiftNUM 参数偏移
shift 默认为删除最前面的1个参数
NUM为数字可以表示删除最前面的NUM个参数
#!/bin/bash echo "This script name is ${0}" echo "Total paras number is $#" echo "The whole paras is \"$@\"" #删除one shift echo "This script name is ${0}" echo "Total paras number is $#" echo "The whole paras is \"$@\"" #删除two shift echo "This script name is ${0}" echo "Total paras number is $#" echo "The whole paras is \"$@\"" shift echo "This script name is ${0}" echo "Total paras number is $#" echo "The whole paras is \"$@\""
执行结果