shell脚本
位置变量
bash script.sh arg1 arg2
$1,$2 对应第一个、第二个(arg1 arg2)等参数shift [n]换位置
$0 命令本身,包括路径
$* 传给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数个数
注意: $@和$* 只在被双引号包起来的时候才会有差异
清空所有位置
set --
shell条件测试符
算术运算符
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
算术运算
let var=2+3
let sum+=i let sum=sum+i
((i=2*3))
expr 2 \* 3
bc
for ((i=0;i<10;i=i+1));do
echo i=$i
done
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
多重条件判断
'判断1 -a 判断2'
逻辑与,判断1和判断2都成立,最终的结果才为真
'判断1 -o 判断2'
逻辑或,判断1和判断2有一个成立,最终的结果就为真
'!判断'
逻辑非,使原始的判断式取反
aa=11
[ -n "$aa" -a "$aa" -gt 23 ] &&echo "yes" || echo "no"
判断变量aa是否有值,同时判断变量aa是否大于23
因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假
条件测试操作
1,测试文件状态
格式:[ 操作符 文件或目录 ]
2,常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-s : 文件存在且不为空,为真
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
-z:字符串内容为空为真。
-n : 字符串内容不为空为真。
-c : 判断是不是设备文件.
-t: fd 文件描述符是否在某终端已经打开
-N: 文件自从上一次被读取之后是否被修改过
-O: 当前有效用户是否文件属主
-G: 当前有效用户是否为文件属组
FILE1 -ef FILE2 #FILE1是否是FILE2的硬链接
FILE1 -ef FILE2 #FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2 #FILE1是否旧于FILE2
大于 -gt (greater than)
小于 -lt (less than)
大于或等于 -ge (greater than or equal)
小于或等于 -le (less than or equal)
不相等 -ne (not equal)
! : 取非
shell 判断变量中是否包含某个字符串
=~ 左侧字符串是否能够被右侧正则表达式所匹配
建议: 当使用正则表达式或通配符使用双中括号[[ ]],其他一般使用[]
str="this is a string"
[[ $str =~ "this" ]] && echo "$str contains this"
[[ $str =~ "that" ]] || echo "$str does NOT contain that"
结果为:
this is a string contains this
this is a string does NOT contains that
[[" 判断命令和 "=~"正则式匹配符号