1. 程式人生 > >Shell中 ${} 用法和例項

Shell中 ${} 用法和例項

Shell中 ${} 用法和例項
檔案路徑(如下):

/dir1/dir2/dir3/my.file.txt

1. 截斷功能

${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

記憶的方法為:

[list] # 是去掉左邊, ## 最後一個

       % 是去掉右邊, %% 第一個

2. 字串提取 

單一符號是最小匹配﹔兩個符號是最大匹配。

${file:0:5}:提取最左邊的 5 個位元組:/dir1

${file:5:5}:提取第 5 個位元組右邊的連續 5 個位元組:/dir2

3. 字串替換

${file/dir/path}: 將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt

4. 針對不同的變數狀態賦值(沒設定、空值、非空值):

${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。(非空值時不作處理)

注意: 

":+" 的情況是不包含空值的.

":-", ":=" 等只要有號就是包含空值(null).

5. 變數的長度

${#file}

6. 陣列運算

A=(a b c def)

${A[@]} 或 ${A[*]} 可得到 a b c def (全部組數)

${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數...

${#A[@]} 或 ${#A[*]} 可得到 4 (全部組數數量)

${#A[0]} 可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)