1. 脚本注释
#!/usr/bin/env bash
# Desc: shell script reference notes
2. 脚本执行与调试
./fileName.sh # 需要执行权限, chmod +x
sh fileName.sh # 脚本中有exit,会退出当前shell
. fileName.sh
source fileName.sh
# 调试
sh -x fileName.sh
# 开启调试
set -x
# 关闭调试
set +x
# 打印日志
function echo_log()
{
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $@" >> run.log
}
3. 变量赋值及引用
- 变量赋值使用
$(data)
- 对变量进行引用或字符串组合时,使用
${}将变量扩含起来
- 处理字符串,加双引号
""
# 脚本中执行或引入库函数
. ./filename
# 返回脚本所在目录
cd $(dirname $0)
4. 输入与输出
# 0 stdin 标准输入
# 1 stdout 标准输出
# 2 stderr 标准错误输出
./filename.sh 1>output 2>error
# 标准输出定向到黑洞设备,不显示输出
./filename >/dev/null 2>&1
5. 比较运算符
# comparison operator
# 文件比较运算符
[ -e filename ] # filename存在,则为真
[ -s filename ] # filename存在且大小大于0
[ -d filename ] # filename为目录,则为真
[ -f filename ] # filename为文件,则为真
[ -L filename ] # filename为符号链接,则为真
[ -r filename ] # filename可读,则为真
[ -w filename ] # filename可写,则为真
[ -x filename ] # filename可执行,则为真
[ filename1 -nt filename2 ] # filename1比filename2新,则为真
[ filename1 -ot filename2 ] # filename1比filename2旧,则为真
# 字符串比较运算符
[ -z string ] # string长度为零,则为真
[ -n string ] # string长度为非零,则为真
[ "str1" = "str2" ] # 字符串是否相同
[ "str1" != "str2" ] # 字符串是否不同
# 算术比较运算符
-eq # 等于
-ne # 不等于
-lt # 小于
-le # 小于或等于
-gt # 大于
-ge # 大于或等于
# 逻辑运算符
&& # and
|| # or
# 布尔运算符
-a # 与运算
-o # 或运算
! # 非运算
[ $a -lt 100 -a $a -gt 90 ] && echo "great"
[ ! -e fileName ] && touch fileName
6. 位置参数
# positional paramter
$# # 表示位置参数的数量
$* # 表示所有位置参数的内容"a b c"
$? # 表示命令执行后返回的状态,成功返回0;不成功,返回非0
$$ # 表示当前进程的进程号
$! # 表示后台运行的最后一个进程号
$0 # 表示当前进程名
$@ # 表示所有位置参数"a" "b" "c"
$n # (n为1-9)就是位置变量
7. 流程控制
# if
function if_func()
{
if [ "$a" -ge "90" ]; then
echo "A"
elif [ "$a" -ge "60" ]; then
echo "B"
else
echo "C"
fi
}
# case
function case_func()
{
case "$input" in
start)
start;;
stop)
stop;;
status)
status;;
version)
version;;
*)
echo "Usage: $0 {start|stop|status|version}"
exit 1
esac
}
# for
function for_func01()
{
for i in $(seq 1 10)
do
echo $i
done
}
function for_func02()
{
for ((i=1;i<=10;i++))
do
echo $i
done
}
# while
function while_func()
{
i=0;
while [ $i -lt 10 ]
do
((i++))
echo $i
done
}
# until
function until_func()
{
i=0;
until [ $i -eq 10 ]
do
((i++))
echo $i
done
}