shell script的执行方式差异
不同的执行方式会给script带来不同的结果,主要是bash的环境。
script的执行方式分为二大类
直接下达指令(文件必须具备可执行权限)
绝对路径 :/home/xxx/yyy.sh
相对路径: ./yyy.sh
环境变量PATH里
将shell script文件放到PATH指定的路径下,可以直接通过文件名执行 yyy.sh
bash程序来执行
通过 bash yyy.sh 或者 sh yyy.sh来执行
利用source或者 . 来执行
source yyy.sh 或者 . yyy.sh
总结
使用前两者执行的方式,系统会使用一个新的bash环境来执行,执行结束后,结果不会回传到现在的bash环境里。
也就是说,通过第一种方式执行结束后,回到当前bash环境下,没法获取变量name的值。
通过第三种方式,系统直接在当前bash下来执行,即使程序结束,变量依然有效。
name="hao"
echo -e "${name}"
shell script使用判断式
1.test判断式
判断文件类型
-e 判断文件名是否存在
-f 判断文件名是否存在且为文件
-d 判断文件名是否存在且为目录
判断文件权限
-r 判断文件是否存在且具有可读的权限
-w 判断文件是否存在且具有可写的权限
-x 判断文件是否存在且具有可执行的权限
两个文件之间的比较
test file1 -nt file2 判断file1是否比file2新
-nt 文件1是否比文件2新
-ot 文件1是否比文件2旧
-ef 文件1是否与文件2是否为同一个档案,主要用在判断 hard link的上
关于两个整数之间的判定
-eq 是否相等
-ne 两数值不相等
判断字符串的数据
test -z string 判断字符串是否为0 ,若string为空串,则为true
test -n string 判断字符串是否非为0
test str1 = str2 判断是否相等
test str1 != str2 判断是否不相等
多重条件判定
test -r file1 -a -x file1
-a and 两状况同时成立
-o or 两状况任意一个成立
! 反状态 例如 test ! -x file 当文件file不具有可执行权限时返回true
#判断文件名是否存在
test -e /root
使用判断符号 []
除了上面的test之外,[]中括号也是常用的判断式,可以结合if 判断式使用。
注意事项:
- [ ] 两端要有空格,每个内容之间都要有空格
- 变量要以双引号括起来
- 常量 用单引号或者双引号
#判断某一个变量是否为空
[ -z "${name}"];echo $?
#判断两个变量是否相等
[ "${name}" == "${}" ]
在bash中 "="和 ""是一样的,为了和其它程序语言保持习惯,还是用“”来比较变量让大家更好理解。
shell script的默认变量
在执行script脚本时,后面可以跟参数。
sh ./test.sh op1 op2 op3 op4
在上面的例子中
$0 代表执行文件名 这里是 test.sh
$1 代表第一个参数 这里是 op1
······
通过这样的功能,我们就可以在shell script里直接引用参数了
其它功能
$# 代表后面参数的个数,上述例子为 4
$@ 代表 “op1” “op2” “op3” “op4” ,每个变量是独立的,用双引号括起来
$* 代表 “op1 op2 op3 op4” 中间默认用 空格 分割
echo "The script name is ===> $0"
echo "Total parameters number is ===> $#"
[ "$#" -lt 2 ] && echo "the number of parameter is less than 2. Stop here" && exit 0
echo "your whole params is ===> '$@'"
echo "the first param is ===> $1"
echo "the second param is ===> $2"
执行上述代码可以测试该部分功能
shift可以偏移参数号码
修改下上述代码
echo "Total parameters number is ===> $#"
echo "your whole params is ===> '$@'"
shift
echo "Total parameters number is ===> $#"
echo "your whole params is ===> '$@'"
shift 3
echo "Total parameters number is ===> $#"
echo "your whole params is ===> '$@'"
上述程序跟着这些参数 one two three four five six
会依次如下显示
Total parameters number is ===> 6
your whole params is ===> ‘one two three four five six’
Total parameters number is ===> 5
your whole params is ===> ‘two three four five six’
Total parameters number is ===> 2
your whole params is ===> ‘five six’
shift会移动变量,可以跟数字,代表拿掉前面几个参数的意思,类似于删除。