Shell学习
常用判断
-e 参数判断对象是否存在,文件或目录都可以做判断
-d 参数判断文件夹是否存在
等同于下面
-f 判断文件是否存在
文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ]
-ot 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ]
前面加叹号表示非的意思
整数比较
-eq 等于,如:if [ “
a
"
−
e
q
"
a" -eq "
a"−eq"b” ]
-ne 不等于,如:if [ “
a
"
−
n
e
"
a" -ne "
a"−ne"b” ]
-gt 大于,如:if [ “
a
"
−
g
t
"
a" -gt "
a"−gt"b” ]
-ge 大于等于,如:if [ “
a
"
−
g
e
"
a" -ge "
a"−ge"b” ]
-lt 小于,如:if [ “
a
"
−
l
t
"
a" -lt "
a"−lt"b” ]
-le 小于等于,如:if [ “
a
"
−
l
e
"
a" -le "
a"−le"b” ]
注意:整数的比较不能使用“==,>=”等。(实际上,在某些情况下可以,不必了解)
整数的比较可以不加引号。
字符串比较
== 等于,如:if [ “
a
"
=
=
"
a" == "
a"=="b” ]
!= 不等于,如:if [ “
a
"
!
=
"
a" != "
a"!="b” ]
< 小于,在ASCII字母顺序下.如:
if [ “KaTeX parse error: Undefined control sequence: \< at position 4: a" \̲<̲ "b” ]
注意:在[]结构中"<"需要被转义.
大于,在ASCII字母顺序下.如:
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
下面两个可以用来判断字符串为空:
-z 字符串为"null".就是长度为0.
-n 字符串不为"null"
注意:字符串的比较需要把字符串使用双引号引用,这是好习惯。
字符串的比较使用“=,>”等符号,字符串没有大于等于这样的用法。
- 由单引号’ '包围的字符串:
任何字符都会原样输出,在其中使用变量是无效的。
字符串中不能出现单引号,即使对单引号进行转义也不行。 - 由双引号" "包围的字符串:
如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
字符串中可以出现双引号,只要它被转义了就行。 - 不被引号包围的字符串
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
获取字符串的长度
${#string_name}:string_name 表示字符串名字
字符串的拼接
字符串的截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
从指定位置开始截取
从字符串左边开始计数:从 0 开始计数
省略后面的长度,会截取到字符串末尾
从字符串右边开始计数:从1开始计数
省略后面的长度,会截取到字符串末尾
从指定字符串开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
使用 # 号截取右边字符
${string#*chars}
其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。
如果不需要忽略chars左边的字符,也可以不写,如下图:
如果希直到最后一个指定字符(子字符串)在匹配结束,可以使用##
使用 % 截取左边字符
${string%chars*}
请注意的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以应该位于 chars 的右侧。其他方面%和#的用法相同
判断的进阶写法
“&&”
“&&”连接两个或多个命令(判断也是命令),如果前一个命令成功或者返回true,那么下一个命令继续执行,如果第一个命令执行不成功,后面的命令也不会执行,“与”的意思。
“||”
“||”连接两个或多个命令,如果前一个命令执行成功,立即退出,不再执行之后的命令;如果前一个命令执行失败,继续向后执行,直到有执行成功的命令为止,“或”的意思。
替代if写法
替代if…else写法
替代elif的写法
注意事项:
1.不建议多层级使用,不易理解;
2.一对括号可以改变&&和||的执行顺序