目錄
- 替換
- 運算符
1、替換
如果表達式中包含特殊字符梭姓,Shell 將會進行替換遵班。例如屠升,在雙引號中使用變量就是一種替換,轉(zhuǎn)義字符也是一種替換狭郑。
示例:
#!/bin/bash
a=10
echo -e "a is $a \n"
輸出:
a is 10
這里-e
表示對轉(zhuǎn)義字符進行替換腹暖。如果不使用 -e 選項,將會原樣輸出:a is 10 \n
可以使用echo
命令的 -E
選項禁止轉(zhuǎn)義翰萨,默認也是不轉(zhuǎn)義的脏答;使用-n
選項可以禁止插入換行符。
變量替換
變量替換可以根據(jù)變量的狀態(tài)(是否為空亩鬼、是否定義等)來改變它的值
可以使用的變量替換形式:
形式 | 說明 |
---|---|
${var} |
變量本來的值 |
${var:-word} |
如果變量 var 為空或已被刪除(unset)以蕴,那么返回 word,但不改變 var 的值辛孵。 |
${var:=word |
如果變量 var 為空或已被刪除(unset)丛肮,那么返回 word,并將 var 的值設(shè)置為 word魄缚。 |
${var:?message} |
如果變量 var 為空或已被刪除(unset)宝与,那么將消息 message 送到標準錯誤輸出焚廊,可以用來檢測變量 var 是否可以被正常賦值。若此替換出現(xiàn)在Shell腳本中习劫,那么腳本將停止運行咆瘟。 |
${var:+word} |
如果變量 var 被定義,那么返回 word诽里,但不改變 var 的值袒餐。 |
示例:
echo ${var:-"變量未定義"}
echo "1 - var的值:${var}"
echo ${var:="var已經(jīng)有值"}
echo "2 - var的值:${var}"
unset var
echo ${var:+"var變量被刪除"}
echo "3 - var的值:$var"
var="Prefix"
echo ${var:+"var被賦值Prefix"}
echo "4 -var的值:$var"
unset var
echo ${var:?"打印信息"}
echo "5 - var的值:${var}"
輸出:
變量未定義
1 - var的值:
var已經(jīng)有值
2 - var的值:var已經(jīng)有值
3 - var的值:
var被賦值Prefix
4 -var的值:Prefix
./test.sh: line 18: var: 打印信息
2、運算符
Bash
支持很多運算符谤狡,包括算數(shù)運算符灸眼、關(guān)系運算符、布爾運算符墓懂、字符串運算符和文件測試運算符
焰宣。
原生bash
不支持簡單的數(shù)學(xué)運算
,但是可以通過其他命令來實現(xiàn)捕仔,例如awk
和 expr
匕积,expr
最常用。
expr
是一款表達式計算工具榜跌,使用它能完成表達式的求值操作闪唆。
示例:
var=`expr 2 + 2`
echo $var
輸出結(jié)果4
,
兩點注意:
表達式和運算符之間要有空格,例如 2+2 是不對的钓葫,必須寫成 2 + 2苞氮,這與我們熟悉的大多數(shù)編程語言不一樣。
完整的表達式要被包含瓤逼,注意這個字符不是常用的單引號笼吟,在 Esc 鍵下邊。
算術(shù)運算符
先來看一個使用算術(shù)運算符的例子:
#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
輸出:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b
乘號(*)前邊必須加反斜杠()才能實現(xiàn)乘法運算霸旗;
關(guān)系運算符
關(guān)系運算符只支持數(shù)字贷帮,不支持字符串,除非字符串的值是數(shù)字诱告。
示例:
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a撵枢、b相等"
else
echo "$a -eq $b: a、b不等"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a精居、b不等"
else
echo "$a -ne $b : a锄禽、b相等"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a大于b"
else
echo "$a -gt $b: a不大于b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a小于b"
else
echo "$a -lt $b: a不小于b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a大于等于b"
else
echo "$a -ge $b: a小于b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a小于等于b"
else
echo "$a -le $b: a大于b"
fi
輸出:
10 -eq 20: a、b不等
10 -ne 20: a靴姿、b不等
10 -gt 20: a不大于b
10 -lt 20: a小于b
10 -ge 20: a小于b
10 -le 20: a小于等于b
運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
-eq
| 檢測兩個數(shù)是否相等沃但,相等返回 true。 | [ $a -eq $b ] 返回 false佛吓。
-ne
| 檢測兩個數(shù)是否相等宵晚,不相等返回 true垂攘。 | [ $a -ne $b ] 返回 true
-gt
| 檢測左邊的數(shù)是否大于右邊的,如果是淤刃,則返回 true | [ $a -gt $b ] 返回 false晒他。
-lt
| 檢測左邊的數(shù)是否小于右邊的,如果是逸贾,則返回 true | [ $a -lt $b ] 返回 true
-ge
| 檢測左邊的數(shù)是否大等于右邊的陨仅,如果是,則返回 true | [ $a -ge $b ] 返回 false
-le
| 檢測左邊的數(shù)是否小于等于右邊的铝侵,如果是灼伤,則返回 true | [ $a -le $b ] 返回 true
布爾運算符
示例:
#!/bin/sh
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : returns true"
else
echo "$a -lt 100 -a $b -gt 15 : returns false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi
輸出:
10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true
運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
!
| 非運算,表達式為 true 則返回 false哟沫,否則返回 true。 | [ ! false ] 返回 true
-o
| 或運算锌介,有一個表達式為 true 則返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a
| 與運算嗜诀,兩個表達式都為 true 才返回 true| [ $a -gt $b ] [ $a -lt 20 -a $b -gt 100 ] 返回 false
字符串運算符
示例:
#!/bin/sh
a="hello world"
b="你好 世界"
if [ "$a" = "$b" ]
then
echo "a、b相等"
else
echo "a孔祸、b不相等"
fi
if [ "$a" != "$b" ]
then
echo "a隆敢、b不相等"
else
echo "a、b相等"
fi
if [ -z "$a" ]
then
echo "字符創(chuàng)a的長度為0"
else
echo "字符串a(chǎn)的長度不為0"
fi
if [ -n "$a" ]
then
echo "字符串a(chǎn)的長度不為0"
else
echo "字符串a(chǎn)的長度為0"
fi
if [ "$a" ]
then
echo "字符串a(chǎn)不為空"
else
echo "字符串a(chǎn)為空"
fi
輸出:
a崔慧、b不相等
a拂蝎、b不相等
字符串a(chǎn)的長度不為0
字符串a(chǎn)的長度不為0
字符串a(chǎn)不為空
注意:if [-z $a],最好寫成這樣:if [-z "$a"],惶室,shell可能會出現(xiàn)警告:too many arguments
運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
=
| 檢測兩個字符串是否相等温自,相等返回 true | [ $a = $b ] 返回 false
!=
| 檢測兩個字符串是否相等,不相等返回 true | [ $a != $b ] 返回 true
-z
| 檢測字符串長度是否為0皇钞,為0返回 true| [ -z $a ] 返回 false
-n
| 檢測字符串長度是否為0悼泌,不為0返回 true| [ -n $a ] 返回 true
str
| 檢測字符串是否為空,不為空返回 true| [ $a ] 返回 true
文件測試運算符
示例:
#!/bin/sh
file="/Users/chenzhichao/Desktop/1.png"
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
if [ -w $file ]
then
echo "文件可寫"
else
echo "文件不可寫"
fi
if [ -x $file ]
then
echo "文件可執(zhí)行"
else
echo "文件不可執(zhí)行"
fi
if [ -d $file ]
then
echo "文件是目錄"
else
echo "文件不是目錄"
fi
輸出:
文件存在
文件可讀
文件可寫
文件不可執(zhí)行
文件不是目錄
文件權(quán)限可以點擊文件右鍵->簡介(屬性)->共享與權(quán)限夹界,可以修改權(quán)限