shell指令碼中字串常用操作整理
阿新 • • 發佈:2019-01-13
shell中常用字串操作整理
shell指令碼中常用字串操作如下:
1. 字串的比較
2. 字串的長度
3. 擷取字串
4. 字串的替換
下面分別講解這些操作的用法。
1. 字串的比較
1.1. 等於和不等於
user=zabbix
# 這是最常用的
if [ "$user" == "zabbix" ]
# 也可以這樣
if [[ "$user" == "zabbix" ]]
我們把這種一個一個字元比較過去的方式叫做字元匹配,那有的就說了,如果我只想判斷字串是否符合我的一些條件,像是以什麼結尾、以什麼開頭或包含哪些字元,就可以用下面的方法實現:
path=/home/zabbix/etc
# 以"/" 開頭,判斷是不是絕對路徑
if [[ "$path" == /* ]]
# 是否包含字元(串)
if [[ "$path" == *za* ]]
# 是否以字元(串)結尾
if [[ "$path" == *tc ]]
我們把上面的方式稱為模式匹配
等於(==)和(!=)用法相同,不再單獨介紹;為了增加程式的可讀性,我一般會把”=”當作賦值用,==在比較的時候用,兩個在比較的時候沒啥差別。
1.2. 判斷字串是否為空
方法如下:
user=zabbix
# 最簡單的,判斷是否非空,和C的用法類似
if [ "$user" ]
# 判斷是否為空
if [ ! "$user" ]
# 用-z也可以判斷是否為空
if [ -z "$user" ]
# 用-n判斷是否不為空
if [ -n "$user" ]
#也可以用最笨的方法,1.1節中講的
if [[ "$user" == "" ]]
細心的讀者已經看到,上面所有關於字串的操作都用”“引起來了,沒有“裸奔”,這樣做是為了規範和安全,我給大家舉一個裸奔不安全的反例。
string="a == b"
if [ $string ]
then
echo "string is not null"
else
echo "string is null"
fi
2. 字串的長度
我只說最常用的一種:${#string},舉例如下:
string1=hello
length_of_string1=${#string}
echo "$length_of_string1" # 結果是5
3. 擷取字串
3.1. 提取子串
格式 | 作用 |
---|---|
${string:position} | 在string中從位置position開始提取子串 |
${string:position:length} | 從位置position提取length長度的子串 |
示例如下:
string2=helloworld
echo "${string2:0}" # helloworld
echo "${string:5}" # world
echo "${string2:5:2}" # wo
echo "${string2: -3}" # rld
position為負數的時候表示從字串的末尾提取長度為n的子串;如果將length作為前面獲取子串的再一次操作,那麼length為正就擷取前lenth個字元,如果length為負數,就去掉後面的length個字元。
示例如下:
string3=helloworld
echo "${string3:5}" # world
echo "${string3:5:2}" # wo 擷取world的前兩個字元
echo "${string3:5:-2}" # wor 刪除world的後兩個字元
3.2. 刪除子串
格式 | 作用 |
---|---|
${string#substring} | 刪除掉左邊最小匹配的子串 |
${string##substring} | 刪除掉左邊最大匹配的子串 |
${string%substring} | 刪除掉右邊最小匹配的子串 |
${string%%substring} | 刪除掉右邊最大匹配的子串 |
示例如下:
string4=abcABC123ABCabc
echo "${string4#a*C}" # 123ABCabc
echo "${string4##a*C}" # abc
echo "${string4%b*c}" # abcABC123ABCa
echo "${string4%%b*c}" # a
4. 子串替換
格式 | 作用 |
---|---|
${string/substring/replacement} | 使用replacement替換第一個匹配的子串 |
${string//substring/replacement} | 使用replacement替換全部匹配的子串 |
示例如下:
string5=abcABC123ABCabc
echo "${string5/abc/xyz}" # xyzABC123ABCabc
echo "${string5//abc/xyz}" # xyzABC123ABCxyz