1. 程式人生 > >linux shell程式設計學習--字串的使用和操作

linux shell程式設計學習--字串的使用和操作

在bash shell的使用過程中,經常會遇到一些字串string的操作,下面是個人的一些使用總結。

一、字串的定義

用雙引號,單引號,或者直接在接在=後,都可以定義一個字串,如下,定義了三個字串

str1="this is a string" 
str2='this is a string'
str3=this_is

但雙引號和單引號,在bash中還是有區別的。
單引號引用,則保留字串的所有字元的字面含義,同時,單引號內不允許再出現單引號,也不會對轉義字元等進行轉義。
雙引號引用,則支援一些擴充套件,如$(美元符) \ (反斜槓)。\$可以引用後面的變數值,\(反斜槓)表示轉義。如下:

str="test_sting."
echo "\\$str" #輸出結果為:\test_string
echo '\\$str' #輸出結果為:\\$str

二、求字串長度

str="test_string"
echo ${#str} #得到長度9

三、字串比較

bash shell中的字串可以進行,大於,小於,等於,判斷是否為空,是否有值等操作。在相等的操作中,支援正則匹配。具體語法如下:

操作符 含義 舉例
< 小於 [[ "1" < "2" ]] #true ASCII 字母順序
> 大於 [[ "2" > "1" ]] #true ASCII 字母順序
== 等於(支援模式匹配) [[ "aa" == "aa" ]] #true
[[ "aaa" == a* ]] #true 模式匹配模式匹配的時候,不能加雙引號
= 等於,與==等價
=~ 判斷字串 [[ "aa" =~ "a" ]] #true
!= 不等於 [[ "a" != "b" ]] #true
-z 是否為空 [[ -z ""]] #true
-n 是否非空 [[ -n "a" ]] #true

bash shell中在比較字串的時候,一般最好用”(雙引號)將值包含起來,避免空格的影響。但在使用d**==(模式匹配)**的時候,則不能使用雙引號

四、字串的截斷

可以使用#,##,%,%%等符號進行字串的截斷操作。bash shell的字串支援四種截斷方式,可以截斷左邊字元或者截斷右邊字元。
假設有字串str

str="This-is-a-test-string"
操作符 含義 舉例
# # 號擷取,從左邊擷取掉最短的匹配,保留右邊字元。 echo ${str#*-} #得到is-a-test-string
## ##號擷取,從左邊擷取掉最長的匹配,保留右邊字元 echo ${str##*-} #得到string
% %擷取,從右邊擷取最短的匹配,保留左邊字元 echo ${str%-*} #得到This-is-a-test
%% %%擷取,從右邊擷取最長的匹配,保留左邊字元 echo ${str%%-*} #得到This

五、字串的擷取

shell字串支援任意位置的子串擷取。語法為:
${org_string:pos:length} 擷取從pos開始的length長度的子串
${org_string:pos:-length} 擷取從pos開始,擷取到距字串結束的length長度的位置的子串
${org_string:(-pos):length} 從距離字串結束的pos位置開始,擷取length長度的子串
${org_string:(-pos):-length} 從距離字串結束的pos位置開始,擷取到距字串結束的length長度的位置的子串
${org_string:pos}擷取從pos開始到字串結束
${org_string:(-pos)}從距離字串結束的pos位置開始,擷取到字串結束
具體用法,如下:

org_str="This-is-a-test-test-string"
echo ${org_str:0:4} #得到 This
echo ${org_str:0:-4} #得到 This-is-a-test-test-st
echo ${org_str:(-11):4} #得到 test
echo ${org_str:(-11):-4} #得到 test
echo ${org_str:4} #得到 -is-a-test-test-string
echo ${org_str(-6)} #得到 string

六、字串的替換

在bash shell的字串中,可以使用新的字串替換舊字串中的子串。
假設有字串org_str

org_str="This-is-a-test-test-string"

具體用法,如下表:

表示式 含義 舉例
${org_str/sub_str/replace_str} 使用$replace_str的值來替換第一個匹配的$sub_str ${org_str/test/TEST} #得到This-is-a-TEST-test-string
${org_str//sub_str/replace_str} 使用$replace_str的值來替換全部匹配的$sub_str ${org_str//test/TEST} #得到This-is-a-TEST-TEST-string
${org_str/#sub_str/replace_str} 如果$org_str是以$sub_str開始,使用$replace_str的值來替換$sub_str ${org_str/#This/THIS} #得到THIS-is-a-test-test-string
${org_str/%sub_str/replace_str} 如果$org_str是以$sub_str結束,使用$replace_str的值來替換$sub_str ${org_str/%string/STRING} #得到This-is-a-test-test-STRING