
在 Bash 解釋器中,内置了許多變量,這些變量的功能是解釋器自帶的,我們在編寫shell腳本時如果能靈活的使用它們,對腳本的編寫效率以及差錯大有幫助, 下面一一介紹這些變量
<code>FUNCNAME</code>和<code>LINENO</code> 變量經常用于腳本的調試
<code>FUNCNAME</code> 表示目前函數的名字,作用範圍僅限函數中使用,在函數外無值
<code>LINENO</code> 表示目前所在腳本中變量出現在的行号
<code>PWD</code> 表示目前目錄, 對應于 <code>pwd</code>指令
現有個腳本 <code>a.sh</code> 内容如下
執行 <code>./a.sh</code> 指令, 輸出如下
在 <code>testa</code> 函數中 <code>FUNCNAME</code> 變量值是 <code>testa</code>,也即函數名字,在函數外部無值
<code>LINENO</code> 變量無論是在函數中還是函數外,都表示目前所在的行号
這兩個變量依次表示目前程序ID和父程序ID
現有 <code>a.sh</code> 腳本,内容如下
<code>sleep 20</code> 睡眠語句是為了讓執行腳本程序暫緩退出,在另一個終端中驗證輸出的結果
在目前終端執行 <code>./a.sh</code>,結果如下
在執行<code>a.sh</code>的腳本程序退出之前,打開另一個終端,執行 <code>ps -o pid,ppid,time,cmd -p 12982,13095</code> 指令,結果如下
從上面的結果可以看出, 執行 <code>./a.sh</code> 指令之後,$$ 變量表示的是 執行<code>a.sh</code>腳本的程序ID 13095 ,而 12982 是它的父程序ID,也即是 <code>PPID</code>變量的值,它是目前bash的執行個體
<code>$#</code> 表示從指令行傳入腳本的參數數量
<code>$0,$1,$2...$n</code> 是從指令行傳遞到腳本的參數 <code>$0</code> 是腳本本身的名字 <code>$1</code> 是第一個參數 <code>$2</code> 是第二個參數,依此類推 <code>$n</code> 是第n個參數
第十個參數及以後的參數必須要用大括号括起來,例如: ${10}、${11}、${12} 依次表示第十個變量、第十一個變量、第十二個變量
都表示位置參數,不過它們之間也有些不同點
使用 <code>$*</code> 時,如果加上雙引号,即 "$* " 的形式,那所有位置的參數會被當作一個單詞來處理,如果不包含雙引号,即 $* 的形式,則每個位置的參數都被當作一個獨立的單詞來處理
而對于 <code>$@</code>,無論是否加上雙引号,每個位置的參數都被當作一個獨立的單詞來處理
現有<code>c.sh</code>, 内容如下
執行 <code>./c.sh 1 2 3</code>,結果如下
從上面的結果可以看出,對于 $* 來說,加了雙引号之後所有位置參數就會被視為一個單詞
對于 $@ 來說,是否加雙引号,結果都是一樣的
是以,僅在使用雙引号時,$*和 $@ 才會有差異
指令、函數或者腳本的退出狀态,在判斷指令的執行結果或者函數的調用結果時很有用處
現有 <code>e.sh</code> 和 <code>f.sh</code> 測試腳本
e.sh 腳本
f.sh 腳本
執行 <code>./f.sh</code> 指令,結果如下
腳本 <code>e.sh</code> 中 <code>test_func</code> 函數功能是:當參數等于10時,退出狀态為 5,否則為 6
<code>sh e.sh test_func 3</code> 指令會調用 <code>e.sh</code> 腳本中的 <code>test_func</code>函數,傳入參數是 3,是以退出狀态為 6,同理可知, <code>sh e.sh test_func 10</code> 指令的退出狀态是 5
在Linux中,指令執行成功,退出狀态為 0 ,失敗則為非 0
<code>test -f $PWD/xx.txt</code> 指令是檢查目前目錄是否存在 <code>xx.txt</code> 檔案,因目前目錄并不存在 <code>xx.txt</code>,是以指令執行失敗,退出狀态為非 0
由于<code>e.sh</code> 存在于目前目錄下,是以 <code>test -f $PWD/e.sh</code> 指令執行成功,退出狀态為 0
此變量用于 Bash 識别字元串或單詞邊界,預設值是空格,腳本中根據需要可以修改此變量的值
現有 <code>b.sh</code>腳本,内容如下
執行 <code>./b.sh</code> 結果如下
從結果可以看出,當 <code>$IFS</code> 為 <code>:</code> 時,字元串 <code>"a:b:c"</code>被解析成 <code>a b c</code>
當 <code>$IFS</code> 為 <code>-</code> 時,字元串 <code>"x-y-z"</code>被解析成 <code>x y z</code>
當 <code>$IFS</code> 為 <code>,</code> 時,字元串 <code>"e,f,g"</code>被解析成 <code>e f g</code>
這些變量都表示系統硬體
本文介紹了一些常用的 Bash 内置變量,對于一些生僻或者平常很少用到的變量可以自行查閱相關資料
https://mp.weixin.qq.com/s/p5q-ydF6ORKUPE0uTGT78A