Bash百寶箱 shell變數及擴充套件

2021-07-22 17:59:34 字數 4798 閱讀 5315

shell變數賦值語句為」name=[value]「,等號兩邊不能有空格,可以給shell變數追加內容」name+=value「,取消shell變數的設定使用」unset name」,例子如下。

$ var=1

$ echo

$var

1$ var=123

$ echo

$var

123$ var+=100

$ echo

$var

123100

$ var=a

$ echo

$var

a$ var=abc

$ echo

$var

abc$ var+=***

$ echo

$var

abc***

$ unset

var$ echo

$var

命令列被拆分成符號以後要進行擴充套件,擴充套件有多種方式,且有一定的順序:大括號擴充套件,波浪號擴充套件、引數、變數和算術擴充套件以及命令替換(從左到右),單詞拆分,以及檔名擴充套件,如果系統支援,則還有另外一種擴充套件,即程序替換,它與引數、變數和算術擴充套件以及命令替換是同時進行的。只有大括號擴充套件,單詞擴充套件以及檔名擴充套件在擴充套件時能夠改變單詞的數目,其它的擴充套件都是單個單詞擴充套件成單個單詞,唯一例外的是對"$@""$"的擴充套件,所有擴充套件完成後再進行引用去除。下面對這些shell擴充套件逐個介紹。

大括號擴充套件是一種能夠生成任意字串的機制,基本形式為「prefixsuffix」或者「prefixsuffix」。大括號擴充套件的字首prefix、字尾suffix是可選的,大括號內的內容為以逗號分隔的字串或者乙個序列表示式,從左到右進行擴充套件。對於字串來說,它們以逗號分隔,如果只有乙個字串,在這個字串的後面有無逗號的效果是不同的。對於序列表示式來說,x和y是乙個整數或者單個字元,型別必須相同,後面的增量increment是個可選的整數值,預設為1或者-1,根據x和y的大小進行選擇,當x和y為整數時,整數的前面可新增乙個0,用以限定整數的寬度,高位不足時用0補齊,最終擴充套件為包括x和y的從較小值到較大值之間的一系列值。

$ foo() z; }

$ foo

afooz abarz

$ foo() z; }

$ foo

a01z a03z a05z a07z a09z

格式正確的大括號擴充套件必須包含沒有被引用的起始和結束大括號,還有至少乙個未被引用的逗號或者序列表示式。大括號擴充套件在其它所有擴充套件之前進行,為了避免與引數擴充套件衝突,大括號擴充套件不會識別字串中的「$使用了冒號「:」的幾種情形:

$    如果parameter沒有設定或者為空,替換為word;否則替換為parameter的值。

$ 如果parameter沒有設定或者為空,不進行任何替換;否則替換為word。

$ 如果parameter沒有設定或者為空,把word賦值給parameter。最終替換為parameter的值。

$ 如果parameter沒有設定或者為空,把word輸出到stderr,否則替換為parameter的值。

$ 擴充套件為parameter中從offset開始的子字串。

$ 擴充套件為parameter中從offset開始的長度不超過length的字元。

使用了嘆號「!」的幾種情形(間接擴充套件):

$ 擴充套件為變數名中含有prefix的一些變數。

$ 如果name為陣列,擴充套件為name的索引;否則結果為0。如果name未定義,結果為空。

$ 如果name為陣列,擴充套件為name的索引;否則結果為0。如果name未定義,結果為空。

使用了井號「#」的幾種情形:

$    結果為parameter所包含的字元數。

$ word與parameter從最左邊開始進行模式匹配,結果為從parameter最左邊刪除匹配到的最短字串後剩下的內容。

$ word與parameter從最左邊開始進行模式匹配,結果為從parameter最左邊刪除匹配到的最長字串後剩下的內容。

使用了百分號「%」的幾種情形(與「#」相反):

$    word與parameter從最右邊開始進行模式匹配,結果為從parameter最右邊刪除匹配到的最短字串後剩下的內容。

$ word與parameter從最右邊開始進行模式匹配,結果為從parameter最右邊刪除匹配到的最長字串後剩下的內容。

字串替換:

$    pattern為一種模式,把parameter中與之匹配的最長字串用string替換。若pattern以#開頭,只匹配parameter的開頭;若pattern以%開頭,只匹配parameter的結尾;若pattern以/開頭,會替換所有匹配到的內容,否則只替換第乙個匹配到的內容;若string為空,可省略pattern後面的/,表示刪除匹配到的內容。
字元大小寫轉換(pattern省略時表示可以匹配每個字元的?):

$    把parameter中與pattern匹配的第乙個字元轉為大寫字母。

$ 把parameter中與pattern匹配的所有字元轉為大寫字母。

$ 把parameter中與pattern匹配的第乙個字元轉為小寫字母。

$ 把parameter中與pattern匹配的所有字元轉為小寫字母。

算術擴充套件可以完成乙個真正的數**算,格式為:

$((expression))
例如:

$ foo=1

$ var=$((foo+=10))

$ echo $var

11

命令替換把命令執行的標準輸出取代命令本身,格式為:

$(command)

`command`

例如:

$ uname -p

x86_64

$ foo=$(uname -p)

$ echo $foo

x86_64

如果系統支援命名管道」fifo「或者能夠以」/dev/fd「方式來命名開啟的檔案,那麼也就支援程序替換,格式為:

<(command)

>(command)

程序替換中的尖括號與左邊的圓括號之間不能留有空格。執行命令時,其輸入和輸出與命名管道fifo或者/dev/fd目錄下的某個檔案相關聯,就好像是command的輸入、輸出與另乙個程序的輸入輸出流綁到了一起。

例如:

$ echo "hello" > test.sh

$ echo "world" >> test.sh

$ cat test.sh

hello

world

$ grep hello <(cat test.sh)

hello

$ echo aa bb cc dd >(awk '')

aa bb cc dd /dev/fd/63

$ echo aa bb cc dd > /dev/fd/63 >(awk '')

$ aa

$ echo aa bb cc dd > /dev/fd/63 >(awk '')

$ bb

$ echo aa bb cc dd > /dev/fd/63 >(awk '')

$ cc

$ echo aa bb cc dd > /dev/fd/63 >(awk '')

$ dd

單詞拆分發生在shell擴充套件中,相關的系統變數為ifs,即internal field separator,預設值為,這些分隔符出現在shell擴充套件結果的行首或行尾將被忽略,其它地方則作為分隔符把單詞分隔開來。

單詞拆分以後,bash會在每個單詞中搜尋「*」、「?」、「[」,如果找到其中乙個,則進行模式匹配,內建命令shopt與模式匹配相關,下面說明模式匹配中的幾個特殊符號。

*    匹配任何字串,包括空字串。

? 匹配任意單個字元。

[...] 匹配方括號中的任一字元。可以是乙個範圍表示式,由連字元連線一對字元,這個範圍受當前語言環境的影響。如果方括號後面的第乙個字元是「!」或「^」,則匹配任一沒有出現在方括號中的字元。如果要匹配字元「-」,可以把它放在方括號中的第乙個或最後乙個位置,如果要匹配字元「]」,可以把它放在方括號中的第乙個位置。

[[:class:]] 通過class指定字元類別,class可以是posix標準中的下列關鍵字:alnum、alpha、ascii、blank、cntrl、digit、graph、lower、print、punct、space、upper、word、xdigit,其中word表示大小寫字母、數字和下劃線。

[[=c=]] 匹配所有的字元c。

[[.symbol.]] 匹配所有的符號symbol。

?(pattern-list) 匹配pattern-list零次或一次。

*(pattern-list) 匹配pattern-list零次或多次。

+(pattern-list) 匹配pattern-list一次或多次。

@(pattern-list) 匹配pattern-list中的某個模式。

!(pattern-list) 與pattern-list中的所有模式都不匹配的其它情形。

經過上面提到的shell擴充套件以後,對於所有沒有被引用的字元,包括反斜線「\」、單引號「』」和雙引號「」」,若不是由shell擴充套件產生的,就會被刪除,最終產生真正的結果。

Bash百寶箱shell變數及擴充套件

shell變數賦值語句為 name value 等號兩邊不能有空格,可以給shell變數追加內容 name value 取消shell變數的設定使用 unset name 例子如下。var 1 echo var 1 var 123 echo var 123 var 100 echo var 1231...

Bash百寶箱 初識gdb

gdb是什麼?在linux終端找man後,對gdb的描述如下 gdb gdb即the gnu debugger的縮寫。gdb是一種除錯工具,使用gdb可以窺探乙個程式在執行時或者crash時的內部資訊,主要有以下四種功能 1 啟動程式,按自定義的方式執行程式。2 在特定條件下 即斷點處 stop程式...

Bash百寶箱 shell內建命令之冒號

在shell中,冒號 是乙個內建 builtin 命令,格式如下 arguments 冒號命令本身沒什麼 使用場景有限,一般用於引數擴充套件,有以下幾種用法 如果parameter沒有設定或者為空,替換為word 否則替換為parameter的值。如果parameter沒有設定或者為空,不進行任何替...