shell變量內字符替換和變量字符修改


 

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 ~]# 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM