Shell Scripts

shell script的良好习惯:

在每个script文件头处记录

  • script的功能
  • script的版本信息
  • script的作者与联系方式
  • script的版权宣告方式
  • script的历史纪录
  • script内较特殊的命令
  • script运行是需要的环境变量与设定

script的执行方式差异(source,sh script,./script)

直接执行script

利用source来执行脚本

善用判断式

利用test指令的测试功能

test 标志 档名
标志 意义
-e 该档名是否存在(常用)
-f 该档名是否存在且为档案(常用)
-d 该档名是否存在且为目录(常用)
-b 该档名是否存在且为一个block device
-c 该档名是否存在且为一个character device
-S 该档名是否存在且为一个Socket档案
-p 该档名是否存在且为一个FIFO档案
-L 该档名是否存在且为一个链接档
-r 检测该档名是否存在且具有可读权限
-w 检测该档名是否存在且具有可写权限
-x 检测该档名是否存在且具有可执行权限
-u 检测该档名是否存在且具有SUID属性
-g 检测该档名是否存在且具有SGID属性
-k 检测该档名是否存在且具有Sticky bit属性
-s 检测该档名是否存在且为非空白档案
示例 test file1 -nt file2
-nt (newer than)判断file1是否比file2新
-ot (older than)判断file1是否比file2旧
-ef 判断file1与file2是否为同一档案
示例 test n1 -eq n2
-eq 两数值相等
-ne 两数值不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
test -z string 判断字符串是否为空,为空返回true
test -n string 判断字符串是否非空,为空返回false
test str1=str2 判断str1是否等于str2,相等返回true
test str1!=str2 判断str1是否等于str2,相等返回false
示例 test -r filename -a -a filename
-a and,两情况同时成立返回true
-o or,两情况任何一个成立返回true
! 反向

利用判断符号[]

[-z "$HOME"];echo $?
[ $"HOME" == "$MAIL" ]

shell script的默认变量($0,$1...)

/xx/scriptname opt1 opt2 opt3...
$0             $1   $2   $3  ...

$#:代表参数个数
$@:代表所有参数
$*:代表"$1c$2c$3",c为分隔符号,默认为空格键

shift:变量号码偏移

shift n

代表拿掉最前面的n个参数,n默认为1

条件判断式

if...then

单层简单条件判断式
if [条件判断式]; then
        当条件判断式成立时,执行
fi

多重复杂条件判断式
if [条件判断式]; then
        当条件判断式成立时,执行
else
        当条件判断式不成立时,执行
fi

if [条件判断式1]; then
        当条件判断式1成立时,执行
elif [条件判断式2]; then
        当条件判断式2成立时,执行
else
        当条件判断式1、2都不成立时,执行
fi

case...esac

case $变量名称 in
 "第一个变量内容")
    程序段
    ;;
 "第二个变量内容")
    程序段
    ;;
 *)               //最后一个变量内容会用*来代表所有值
    程序段
    ;;
esac

function

function fname() {
    程序段
}

循环

while do done,until do done

while [condition]
do
    程序段
done

until [condition]
do
    程序段
done

for...do...done

for var in con1 con2 ...
do
    程序段
done

for ((初始值;限制值;执行步阶))
do
    程序段
done

shell script的追踪于debug

sh [-nvx] script.sh

-n:不执行script,仅检查语法
-v:执行script之前,先把script的内容输出到屏幕上
-x:将使用到的script内容显示到屏幕上

results matching ""

    No results matching ""