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

2021-12-30 02:38:44 字數 3459 閱讀 5206

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的一些變數。

$ 擴充套件為變數名中含有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)程序替換中的尖括號與左邊的圓括號之間不能留有空格。執行命令時,其輸入和輸出與命名管道fifo或者/dev/fd目錄下的某個檔案相關聯,就好像是command的輸入、輸出與另乙個程序的輸入輸出流綁到了一起。

例如:$ echo "hello" > test.sh

$ echo "world" >> test.sh

$ cat test.sh

hello

world

$ grep hello (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百寶箱 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沒有設定或者為空,不進行任何替...