shell學習之()與{}的使用

來源:互聯網
上載者:User

shell學習之()與{}的使用
在 shell command line 中,一般人或許不太計較 ( ) 與 { } 這兩對符號的差異,
雖然兩者都可將多個命令作群組化處理,但若從技術細節上,卻是很不一樣的:
( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。

{ } 則是在同一個 shell 內完成,也稱為 non-named command group。

在 bash shell 中,$( ) 與 ` ` (反引號) 都是用來做命令替換用(command substitution)
的。

為了完整起見,我這裡再用一些例子加以說明 ${ } 的一些特異功能:
假設我們定義了一個變數為:
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-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。 (非
空值時不作處理)

${#var} 可計算出變數值的長度:
${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個位元組...

一般而言,A="a b c def" 這樣的變數只是將 $A 替換為一個單一的字串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部組數)
${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數...

好了,最後為大家介紹 $(( )) 的用途吧:它是用來作整數運算的。

在 $(( )) 中的變數名稱,可於其前面加 $ 符號來替換,也可以不用,如:

$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19

此外,$(( )) 還可作不同進位(如二進位、八進位、十六進位)作運算呢,只是,輸出結果皆為
十進位而已:
echo $((16#2a)) 結果為 42 (16 進位轉十進位)

事實上,單純用 (( )) 也可重定義變數值,或作 testing:
a=5; ((a++)) 可將 $a 重定義為 6
a=5; ((a--)) 則為 a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。
常見的用於 (( )) 的測試符號有如下這些:
<:小於
>:大於

<=:小於或等於
>=:大於或等於
==:等於
!=:不等於

參考《shell十三問》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.