传参
在外部执行时可以给脚本传参
在脚本当中获取时 , $0
是执行的文件路径$1
代表第一个参数 , $2
代表第二个参数 , 以此类推
1 | echo "当前文件:$0" |
执行脚本
1 | ./test.sh aa bb |
变量的判断
对于shell脚本来说 , 传参通常是比较灵活的
所以经常需要判断是否传入了这个参数
1 | if [ -n "$1" ] |
这是判断某个变量是否有值的方式
因为解释型语言的语法比较松散 , 对于变量先定义后使用没有严格要求
所以直接使用一个变量而不进行检查可能造成灾难性的后果
运算
原生bash对数学运算的支持比较有限
方法1 $((expression))
1 | num1=3 |
变量的引用加不加$都可以 , 不能计算浮点数
方法2 $[expression]
1 | num1=3 |
变量的引用加不加$都可以 , 不能计算浮点数
方法3 let
关键字
1 | num1=3 |
变量的引用加不加$都可以 , 不能计算浮点数 , 加号两端不能有空格
方法4 使用expr
这是一个内建的用于数学运算的命令
需要注意的是运算符两边必须要有空格
1 | expr 2 + 6 |
关系运算
bash当中原生支持关系运算
比较是否相等
1 | if [ $a == $b ] |
|运算符|含义|其他表示方式|备注|
|—–|—|———|
|-eq|是否相等|==||
|-ne|是否不相等|!=||
|-gt|大于|>||
|-lt|小于|<||
|-ge|大于等于|>=|使用>=需要使用(( ))|
|-le|小于等于|<=|使用<=需要使用(( ))|
1 | if [ $a -ge $b ] |
关系运算符只能用于整数 , 或者能够解析为整数的字符串
布尔运算
运算符 | 含义 | 其他表示方式 |
---|---|---|
! | 非 | |
-o | 或 | || |
-a | 与 | && |
1 | # a小于10 并且 b大于20 |
说明
推荐使用[[ ... ]]
条件判断结构,而不是[ ... ]
,能够防止脚本中的许多逻辑错误。比如,&&、|| 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
字符串运算
运算符 | 含义 |
---|---|
= | 两个字符串是否相同(区别于数字的比较) |
!= | 两个字符串是否不相同 |
-z | 字符串长度为0返回true |
-n | 字符串长度不为0返回true |
1 | a="123" |
使用-n
和-z
的时候需要注意 , 需要在字符串变量引用上加双引号
1 | if [ -n "$a"] |
如果不加双引号 , 当a为空的时候 , 相当于执行if [ -n ]
, 这个时候会把里面的**-n**当做一个普通字符串来处理 , 而不是运算符
自然每次都会是true , -z 同理
文件测试运算符
一个字符串也可以表示一个文件(目录)的路径
使用这些方式可以获得这个文件的各种信息
运算符 | 含义 |
---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true |
-d file | 检测文件是否是目录,如果是,则返回 true |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true |
-p file | 检测文件是否是有名管道,如果是,则返回 true |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true |
-r file | 检测文件是否可读,如果是,则返回 true |
-w file | 检测文件是否可写,如果是,则返回 true |
-x file | 检测文件是否可执行,如果是,则返回 true |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true |
1 | filepath=/usr/local/test.txt |