script执行方式的差异
source、sh script、./script
sh script或者直接执行脚本,是产生子程序,并在子程序内的bash进行执行,执行结束后变量或动作将结束而不会回传父程序
source则是在父程序内直接执行,所以在更改环境变量后一般使用source使更改后的环境变量生效
判断式
test指令测试功能
文件类型判断
参数 意义
-e “文件名”是否存在
-f “文件名”是否存在且为文件
-d “文件名”是否存在且为目录
-b “文件名”是否存在且为block device设备
-c “文件名”是否存在且为character device设备
-S “文件名”是否存在且为socket设备
-p “文件名”是否存在且为FIFO(pipe)文件
-L “文件名”是否存在且为链接文件
文件权限判断
参数 意义
-r “文件名”是否存在且具有可读权限
-w “文件名”是否存在且具有可写权限
-x “文件名”是否存在且具有可执行权限
-u “文件名”是否存在且具有SUID属性
-g “文件名”是否存在且具有SGID属性
-k “文件名”是否存在且具有sticky bit属性
-s “文件名”是否存在且为非空白文件
两个文件的比较
参数 意义
-nt file1比file2新(newer than)
-ot file1比file2旧(older than)
-ef 两个文件是否为同一个文件(是否指向同一个inode,hard link)
两个整数的比较
参数 意义
-eq x==y(equal)
-ne x!=y(not equal)
-gt x>y(greater than)
-lt x<y(less than)
-ge x>=y(greater than or equal)
-le
x<=y(less than or equal)
字符串数据的判断
参数 意义
test -z string 判断字符串是否为空字符串,为空则true,否则false
test -n string 判断字符串是否不为空字符串,不为空则true,否则false
test str1 == str2 判断两个字符串是否相等,相等则true,否则false
test str1 != str2 判断两个字符串是否不相等,不相等则true,否则false
多重条件判断
参数 意义
-a 条件同时成立
-o 条件之一成立
! 否,取反
判断符号[]
中括号以及运算符的两端都必须有空格符分割,例如 ◊代表空格[◊"$HOME"◊==◊"$MAIL"◊]
在中括号 [] 内的每个元件都需要有空白键来分隔;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来
shell script的默认变量($0 $1 $? $#)
脚本可以接收参数,默认变量参数如下
/path/to/script opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
$#:脚本接收的参数个数,上例为4
$@:脚本接收的各个参数,上例为 "$1" "$2" "$3" "$4"
$*:脚本接收的所有参数,上例为 "$1 $2 $3 $4"
shift:参数变量偏移
shift [number],number为偏移量
条件判断
if [ 条件判断式 ]; then
条件成立时的执行程序
fi
&&代表AND与
||代表or或
if [ 条件判断式 ]; then
条件一成立时的执行程序
else
条件二成立时的执行程序
else
条件三成立时的执行程序
fi
case $变量内容 in
"第一个变量内容")
执行程序
;;
"第二个变量内容")
执行程序
;;
......
"第N个变量内容")
执行程序
;;
*) ==其他变量内容
执行程序
;;
esac
函数function
function 函数名() {
执行程序
}
循环
注意[]里面跟条件要有一个空格
不定循环
while [ 条件 ]
do
执行程序
done
until [ 条件 ]
do
执行程序
done
固定循环
for var in con1 con2 ...
do
执行程序
done
for((初始值;条件;循环))
do
执行程序
done
shell script追踪与判断
sh [-nvx] script.sh
-n:不执行sctipt,仅检查语法
-v:执行script前将script内容输出到终端
-x:将使用到的script内容显示到屏幕上