vi test.sh
a=12345123 #將${a}里的第一個123替換為321 b=${a/123/321}; echo "echo variable a" echo $a echo "echo variable b" echo $b a=12345123 #將${a}里的所有123替換為321 b=${a//123/321}; echo "echo variable a" echo $a echo "echo variable b" echo $b
不過,假如你只是看到 ${ } 只能用來定界變量名稱的話,那你就實在太小看bash了 !
為了完整起見,我們這里用了一些例子加以說明 ${ } 的一些特異功能:
假設我們定義了一個變量為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲取的不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt
${file##*.}:拿掉最后一個 . 及其左邊的字串:txt
${file%/*}:拿掉最后條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最后一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鍵盤上 # 在 $ 之左邊)
% 是去掉右邊(在鍵盤上 % 在 $ 之右邊)
單一符號是最小匹配;兩個字符是最大匹配。
${file:0:5}:提取最左邊的 5 個字節:/dir1
${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2
變量值里的字符串做替換:
${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
變量值里的字符串里,刪除指定字符
${file/dir}:將第一個 dir 刪除:/1/dir2/dir3/my.file.txt
${file//dir}:刪除所有dir字符:/1/2/3/my.file.txt
利用 ${ } 還可針對不同的變數狀態賦值(沒設定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)
tips:
以上的理解在於, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態.
一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.
還有哦,${#var} 可計算出變量值的長度:
${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節...
將帶有前綴為prefix的參數名打印出來
${!prefix*}
${!prefix@}
下面這個是針對name數組的,打印出來name數組有哪些下標
${!name[@]}
${!name[*]}
可以理解下下面這幾個例子:
獲取字符串長度
[root@cnblogs ~]# testvar="12345"
[root@cnblogs ~]# echo ${#testvar}
5
對變量值進行大小寫轉換
將變量值中的小寫字母裝換為大寫
語法:echo ${var^^}
[root@cnblogs ~]# testvar="case conversion" [root@cnblogs ~]# echo ${testvar} case conversion [root@cnblogs ~]# echo ${testvar^^} CASE CONVERSION [root@cnblogs ~]#
將變量值中的大寫字母裝換為小寫
語法:echo ${var,,}
[root@cnblogs ~]# testvar="CASE CONVERSION" [root@cnblogs ~]# echo ${testvar} CASE CONVERSION [root@cnblogs ~]# echo ${testvar,,} case conversion [root@cnblogs ~]#
當變量值為空或者非空時操作變量
${var:=value}
上述語法表示如果var為空,則返回value,並將value賦值給var,如果var不為空,則返回var本身的值,var不為空時,var值不會被改變,var為空時,var的值會被設置成指定值。
${var:-value}
上述語法表示如果var為空,則返回value,如果var不為空,則返回var的值,無論var是否為空,var本身的值不會改變。
${var:+value}
上述語法表示如果var不為空,則返回value,如果var為空,則返回空值,無論var是否為空,var本身的值不會改變。
${var:?error_info}
上述語法表示如果var為空,那么在當前終端打印error_info,如果var的值不為空,則返回var的值,無論var是否為空,var本身的值都不會改變。
從指定位置截取字符串,截取到字符串的末尾
#下例表示從正數第4個字符以后開始截取,直到字符串的末尾。
[root@cnblogs ~]# website="www.cnblogs.com" [root@cnblogs ~]# echo ${website:4} cnblogs.com [root@cnblogs ~]#
#下例表示從倒數第4個字符開始截取,直到字符串的末尾
#注意:下例中的"負號"與"冒號"之間必須存在0或者空格
[root@cnblogs ~]# website="www.cnblogs.com" [root@cnblogs ~]# echo ${website:0-4} .com [root@cnblogs ~]# echo ${website: -4} .com [root@cnblogs ~]#
從指定位置截取字符串,並且截取指定的長度
#下例表示從正數第4個字符以后開始截取,截取7個字符。
[root@cnblogs ~]# website="www.cnblogs.com" [root@cnblogs ~]# echo ${website:4:7} cnblogs [root@cnblogs ~]#
下例表示從倒數第11個字符開始截取,截取7個字符。
[root@cnblogs ~]# website="www.cnblogs.com" [root@cnblogs ~]# echo ${website:0-11:7} cnblogs [root@cnblogs ~]#