shell script是利用shell的功能所写的一个程序,这个程序使用纯文本文件,将一些shell的语法与命令写在里面。
shell script可以简单被看成是批处理文件,也可以被说成是一个程序语言,且这个程序语言由于都是利用shell与相关工具命令,所有不需要编译即可执行。
利用bash(或sh)来执行脚本时,该script都会使用一个新的bash环境来执行脚本内的命令。其实script是在子进程的bash内执行的。
当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程中。
但是,如果使用source 来执行脚本,则在父进程中执行。sh02.sh结束后,其变量没有消失。
source sh02.sh
一个例子:
#!/bin/bash
# Program:
# 点明这个脚本的作用
# History:
# 指出修改历史
# 指出主要环境变量
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH
...(正文)
command opt1 opt2 opt3
如:
bash sh01.sh one two three
其中:
$0:表示命令本身
$1:表示命令后第一个参数
$2:表示命令后第二个参数
$#:表示参数的个数(不包括$0)
用以下方式赋值
变量 = $((计算式))
read -p "Please input the data: " data # 提示用户输入
首先介绍一个命令test,可以用来检测文件的相关属性。如下图所示:
常用的测试标志:
关于文件类型:
测试标志 | 代表意义 |
---|---|
-e | 该文件名是否存在 |
-f | 该文件是否存在且为文件 |
-d | 该文件名是否存在且为目录 |
关于文件的权限检测:
测试标志 | 代表意义 |
---|---|
-r | 检测该文件名是否存在且具有“可读”的权限 |
-w | 检测该文件名是否存在且具有“可写”的权限 |
-x | 检测该文件名是否存在且具有“可执行”的权限 |
-u | 检测该文件名是否存在且具有“SUID”的权限 |
-g | 检测该文件名是否存在且具有“SGID”的权限 |
-k | 检测该文件名是否存在且具有“Sticky bit”的权限 |
两个文件之间的比较:
测试标志 | 代表意义 |
---|---|
-nt | newer than 判断file1是否比file2新 |
-ot | older than 判断file1是否比file2老 |
-ef | 判断file1和file2是否为同一个文件,主要是判断是否指向同一个inode(硬连接) |
多重条件判定:
测试标志 | 代表意义 |
---|---|
-a | 两个条件同时成立 |
-o | 任何一个条件成立 |
! | 反向 |
例子:
read -p "Input a file name: " filename
test -e $filename && echo "exist" || echo "Not exist"
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK"
注意空格:
[(空格)"$yn"(空格)==(空格)"Y"(空格)]
注意引号
if [(空格)条件判断式 (空格)]; then
内容
fi # 表示结束if
例如:
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
...
fi
if [ 条件判断式 ] ; then
...
else
...
fi
if [ 条件判断式 ] ; then
...
elif
...
else
...
fi
case $变量名称 in
"第一个变量内容")
程序段
;;
"第二个变量内容")
程序段
;;
*)
不包含第一或者第二变量内容的
exit 1
;;
esac
例子
case $1 in
"one" )
echo "You input one"
;;
"two:)
echo "You input two"
;;
*)
echo "You input others"
;;
esac
function fname(){
程序段
}
由于shell script 执行顺序是由上到下,由左到右,因此function需要写在最前面。在script中调用的时候,传参方式类似bash 执行script。
例子:
function myfun(){
echo "you input: " $1
# $0是函数名
}
myfun abc
while [ condition ]
do
...
done
例子:
s=0
i=0
while [ "$i" != "100" ]
do
i=$( ($i+1) )
s=$( ($s+$i) )
done
for var in con1 con2 con3
do
...
第一次循环时,$var的内容是con1
第二次循环时,$var的内容是con2
...
done
例子
for sitenuu in $(seq 1 100) # seq为连续的意思,从1到100
do
done
for ( (初始值; 限制值; 执行步长) )
do
...
done
例子
for ( (i=1; i<=$nu; i=i+1) )
do
...
done
sh [-nvx] scripts.sh
-n:不要执行script,仅查询语法的问题
-v:在执行script前,先将script的内容输出到屏幕上
-x:将使用到的script内容显示到屏幕上