一、shell script:
顾名思义,就是为shell写的”脚本“
shell script 是利用 shell 的功能所写的一个“程序(program)”,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面,搭配正则表达式、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
简单来说,就是为了 onetouch 就可以实现复杂的功能
作用:
自动化管理
追踪与管理系统的重要工作(例如系统的启动功能就是通过/etc/init.d/rsyslogd这个script去重新启动系统登录文件)
简单的入侵检测(例如写脚本来限制ip访问)
连续指令单一化(多个指令一条执行)
简单的数据处理
使用注意事项:
shell执行的几种方式:
直接下达:必须具备可读可写权限rw
绝对路径:使用 /home/dmtsai/shell。sh 来下达指令;
相对路径:假设工作目录在/home/dmtsai/,则使用 ./shell.sh 来执行
变量“PATH”功能:将 shell.sh 放在 PATH 指定的目录内,例如: “~/bin/ ps:
为什么./shell.sh可以执行script? 因为默认使用者主文件夹下的~/bin/是放入PATH中的,若此时该路径下的sh有rw权限,即可直接执行
为什么 bash ./shell.sh也可以执行? 因为/bin/sh == /bin/bash(链接🔗文件),所以就是直接以bash shell.sh执行(只需要有r权限即可)
示例:
[dmtsai@study ~]$ mkdir bin; cd bin
[dmtsai@study bin]$ vim hello. sh
#!/bin/bash
# 宣告本条script所使用的shell为bash,执行该script的时候会加载bash配置文件来支持bash语法
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/07/16 Bird 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
#回传值0 通知系统
数值运算:
ps:如果需要计算还有小数点的内容,则配合bs使用
echo "123.123*56.59" | bc
12.2.2 script的执行方式差异
直接执行script(sh script | ./script) 每次执行一个script,会在子程序的bash中执行,子程序中的各项变量或者动作结束后不会返回父程序
source 直接在父程序中执行,各项动作会在原本的bash内生效
12.3 善用判断式
12.3.1 test指令测试功能
test [-efd] [file | directory]
#-e: 测试该”文件名是否存在“
#-f:测试“文件名”是否存在且是否为文件(file)?
#-d:测试”文件名是否存在且是否为目录(directory)“
test可配合 && ||等来输出信息
12.3.2 利用判断符号 []
tips:
因为中括号使用在很多地方如万用字符和正则表达式等等,所以如果在bash中使用中括号判断符,中括号两端需要有空白字符分隔
12.3.3 Shell script 的默认变量($0, $1...)
执行的脚本文件名为$0这个变量,第一个接着的参数就是$1...
$# :代表后接的参数”个数“
$@ :代表” "$1" "$2" "$3" "$4" “ (取决于总共有几个参数)
shift:偏移变量 让脚本后面所接的变量进行偏移
输出结果如下:
12.4 条件判断式
12.4.1 if...then
单层条件判断式
if [条件判断式];then
xxx
fi <=将if反过来写,结束
多重条件判断式
if [条件判断式];then
xxx
else
xxx
fi <=将if反过来写,结束
--------------------------------------
if [条件判断式];then
xxx
elif
xxx
else
xxx
fi <=将if反过来写,结束
12.4.2 利用case ..... esac判断
12.4.3 利用function函数功能
#function 范例
function fun(){
echo "Your choice is ${1}"
}
tips:function也有类似shell script的默认内置变量机制, $1,$2...指的是给的第1.2...个参数
12.5 loop循环
#不定循环
while [ condition ]
do
xxx
done
--------------------------------------
until [ condition ]
do
xxx
done
# 固定循环
for var in con1 con2 con3 ...(也可以 seq 1 100 来制造连续整数)
do
xxx
done
------------------------------
#for循环数值处理
for ((初始值; 限制值; 执行步阶))
#例如
for((i = 1; i <=${nu}; i = i + 1 ))
do
xxx
done
12.6 shell script 的追踪与debug
如何在不执行script的情况下进行debug呢? 试试sh吧
sh [-nvx] script.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v:再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!