溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解shell中$()與${}

發(fā)布時(shí)間:2021-11-08 10:43:40 來(lái)源:億速云 閱讀:151 作者:柒染 欄目:建站服務(wù)器

本篇文章為大家展示了如何理解shell中$()與${},內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

$( )與` `(反引號(hào))

在bash shell中,$( )與` `(反引號(hào))都是用來(lái)做命令替換(command substitution)用的。
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
得到上一星期天的日期

用$( )的理由

1. ` `很容易與' '(單引號(hào))搞混。有時(shí)在一些奇怪的字形顯示中,兩種符號(hào)是一模一樣的(直豎兩點(diǎn))。
2. 在多層次的復(fù)合替換中,` `須要額外的跳脫(\`)處理,而$( )則比較直觀。例如:
command1 `command2 `command3` `
原本的意圖是在command2 `command3`中先將command3替換出來(lái)給command2處理,然后再將結(jié)果傳給command1 `command2 ...`來(lái)處理。
然而,真正的結(jié)果在命令行中卻是分成了`command2`與` `兩段。
正確的輸入應(yīng)該如下:
command1 `command2 \`command3\` `
換成$( )則一目了然:
command1 $(command2 $(command3))

$( )的不足

` `基本上可在全部的unix shell中使用,若寫(xiě)成shell script移植性比較高。而$( )并不是每一種shell都能使用。

${ }用來(lái)作變量替換

一般情況下,$var與${var}作用相同。但是用${ }會(huì)比較精確的界定變量名稱的范圍,例如:
$ A=B
$ echo $AB
原本是打算先將$A的結(jié)果替換出來(lái),然后再補(bǔ)一個(gè)B字母于其后,但在命令行上,真正的結(jié)果卻是只會(huì)替換變量名稱為AB的值出來(lái)。
使用${ }就沒(méi)問(wèn)題了:
$ echo ${A}B
BB

${ }的一些特異功能

定義一個(gè)變量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分別替換獲得不同的值:
${file#*/} 拿掉第一個(gè) / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一個(gè) / 及其左邊的字符串:my.file.txt
${file#*.} 拿掉第一個(gè) . 及其左邊的字符串:file.txt
${file##*.} 拿掉最后一個(gè) . 及其左邊的字符串:txt
${file%/*} 拿掉最后一個(gè) / 及其右邊的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一個(gè) / 及其右邊的字符串:(空值)
${file%.*} 拿掉最后一個(gè) . 及其右邊的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一個(gè) . 及其右邊的字符串:/dir1/dir2/dir3/my
記憶的方法:
# 去掉左邊(鍵盤(pán)上 # 在 $ 的左邊)
% 去掉右邊(在鍵盤(pán)上 % 在 $ 的右邊)
單一符號(hào)是最小匹配,兩個(gè)符號(hào)是最大匹配。
${file:0:5} 提取最左邊的 5 個(gè)字節(jié):/dir1
${file:5:5} 提取第 5 個(gè)字節(jié)右邊的連續(xù) 5 個(gè)字節(jié):/dir2
也可以對(duì)變量值里的字符串作替換:
${file/dir/path} 將第一個(gè) dir 替換為 path:/path2/dir2/dir3/my.file.txt
${file//dir/path} 將全部 dir 替換為 path:/path2/path3/path4/my.file.txt
利用${ }還可針對(duì)不同的變量狀態(tài)賦值(未設(shè)定、空值、非空值): 
${file-my.file.txt} 若 $file 未設(shè)定,則使用 my.file.txt 作傳回值。(空值及非空值時(shí)不作處理) 
${file:-my.file.txt} 若 $file 未設(shè)定或?yàn)榭罩担瑒t使用 my.file.txt 作傳回值。(非空值時(shí)不作處理)
${file+my.file.txt} 若 $file 設(shè)為空值或非空值,均使用 my.file.txt 作傳回值。(未設(shè)定時(shí)不作處理)
${file:+my.file.txt} 若 $file 為非空值,則使用 my.file.txt 作傳回值。(未設(shè)定及空值時(shí)不作處理)
${file=my.file.txt} 若 $file 未設(shè)定,則使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt。 (空值及非空值時(shí)不作處理)
${file:=my.file.txt} 若 $file 未設(shè)定或?yàn)榭罩担瑒t使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt。 (非空值時(shí)不作處理)
${file?my.file.txt} :若 $file 未設(shè)定,則將 my.file.txt 輸出至 STDERR。(空值及非空值時(shí)不作處理)
${file:?my.file.txt} :若 $file 未設(shè)定或?yàn)榭罩?,則將 my.file.txt 輸出至 STDERR。(非空值時(shí)不作處理)
以上的理解在于,一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態(tài)。
一般而言,與 null 有關(guān),若不帶 : 的話,null 不受影響,若帶 : 則連 null 也受影響。
${#var} 可計(jì)算出變量值的長(zhǎng)度:
${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 剛好是 27 個(gè)字節(jié)。

bash數(shù)組(array)處理方法

一般而言,A="a b c def"只是將 $A 替換為一個(gè)單一的字符串,但是改為 A=(a b c def),則是將 $A 定義為數(shù)組。
bash的數(shù)組替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 得到 a b c def(全部數(shù)組)
${A[0]} 得到 a (第一個(gè)元素),${A[1]} 第二個(gè)...
${#A[@]} 或 ${#A[*]} 得到 4 (數(shù)組數(shù)量)
${#A[0]} 得到 1 (第一個(gè)元素 a 的長(zhǎng)度),${#A[3]} 得到 3 (第四個(gè)元素 def 的長(zhǎng)度)
A[3]=xyz 將第四個(gè)元素重新定義為 xyz

$(( ))的用途

用來(lái)作整數(shù)運(yùn)算。在 bash 中,$(( ))的整數(shù)運(yùn)算符號(hào)大致有這些:
+ - * / 加、減、乘、除
% 余數(shù)運(yùn)算
& | ^ ! AND、OR、XOR、NOT運(yùn)算
舉例:
$ a=5; b=7; c=2
$ echo $((a+b*c))
19
$ echo $(((a+b)/c))
6
$ echo $(((a*b)%c))
1
在$(( ))中的變量名稱也可以在其前面加 $ 符號(hào):$(($a+$b*$c))也可以得到 19 的結(jié)果。
此外,$(( ))還可以作不同進(jìn)制(如二進(jìn)制、八進(jìn)位、十六進(jìn)制)運(yùn)算,只是輸出結(jié)果皆為十進(jìn)制而已。
echo $((16#2a)) 結(jié)果為 42 (16進(jìn)位轉(zhuǎn)十進(jìn)制)
舉一個(gè)實(shí)用的例子:
當(dāng)前的 umask 是 022,新建文件的權(quán)限為:
$ umask 022
$ echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
事實(shí)上,單純用(( ))也可以重定義變量值,或作testing:
a=5; ((a++)) 將 $a 重定義為 6
a=5; ((a–)) a=4
a=5; b=7; ((a < b)) 會(huì)得到 0 (true) 的返回值
常見(jiàn)的用于(( ))的測(cè)試符號(hào)有以下這些:
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于

上述內(nèi)容就是如何理解shell中$()與${},你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI