一、內建變數
1.$BASH
Bash的二進位程式檔案的路徑(指令碼解譯器的路徑)
$ vim test.sh
輸入代碼:
#!/bin/bashecho $BASH
運行代碼:
$ bash test.sh
2.$FUNCNAME
當前函數的名字
$ vim test.sh
輸入代碼:
#!/bin/bashxyz23 (){ echo "$FUNCNAME now executing." # 正常情況下列印: xyz23 now executing. # 在個別版本的bash中,並不支援$FUNCNAME內建變數}xyz23echo "FUNCNAME = $FUNCNAME" # FUNCNAME =# 超出函數的範圍就變為null值了.
運行代碼:
$ bash test.sh
3.$IFS
內部域分隔字元,這個變數用來決定 Bash 在解釋字串時如何識別域,或者單詞邊界。
$IFS預設為空白(空格,定位字元,和分行符號),但這是可以修改的,比如,在分析逗號分
隔的資料檔案時,就可以設定為逗號,注意 $* 使用的是儲存在$IFS中的第一個字元。
$ vim test.sh
輸入代碼:
#!/bin/bash# $IFS 處理空白與處理其他字元不同.output_args_one_per_line(){ for arg do echo "[$arg]" done}echo; echo "IFS=\" \""echo "-------"IFS=" "var=" a b c "output_args_one_per_line $var # output_args_one_per_line `echo " a b c "`## [a]# [b]# [c]echo; echo "IFS=:"echo "-----"IFS=:var=":a::b:c:::" # 與上邊一樣, 但是用" "替換了":".output_args_one_per_line $var## []# [a]# []# [b]# [c]# []# []# []# 同樣的事情也會發生在awk的"FS"域中.# 感謝, Stephane Chazelas.echoexit 0
注意: 你可能對上面的for迴圈和變數arg有疑問,這將在下一節進行討論。
運行代碼:
$ bash test.sh
4、$REPLY
當沒有參數變數提供給 read 命令的時候,這個變數會作為預設變數提供給 read 命令。也
可以用於 select 菜單,但是只提供所選擇變數的編號,而不是變數本身的值。在個別版本的bash中,並不支援內建變數$REPLY。
$ vim test.sh
輸入代碼:
#!/bin/bash# reply.sh# REPLY是提供給'read'命令的預設變數.echoecho -n "What is your favorite vegetable? "readecho "Your favorite vegetable is $REPLY."# 若且唯若沒有變數提供給"read"命令時,#+ REPLY才儲存最後一個"read"命令讀入的值.echoecho -n "What is your favorite fruit? "read fruitecho "Your favorite fruit is $fruit."echo "but..."echo "Value of \$REPLY is still $REPLY."# $REPLY還是儲存著上一個read命令的值,#+ 因為變數$fruit被傳入到了這個新的"read"命令中.echoexit 0
運行代碼:
$ bash test.sh
5.通過$*和$@列出所有的參數
"$*" 所有的位置參數都被看作為一個單詞。
$@與 $* 相同,但是每個參數都是一個獨立的引用字串,這就意味著,參數是被完整
傳遞的,並沒有被解釋或擴充。這也意味著,參數列表中每個參數都被看作為單獨的單詞。
$ vim test.sh
輸入代碼:
#!/bin/bash# 多使用幾個參數來調用這個指令碼, 比如"one two three".E_BADARGS=65if [ ! -n "$1" ]thenecho "Usage: `basename $0` argument1 argument2 etc."exit $E_BADARGSfi echoindex=1 # 起始計數.echo "Listing args with \"\$*\":"for arg in "$*" # 如果"$*"不被""(雙引號)引用,那麼將不能正常地工作.doecho "Arg #$index = $arg"let "index+=1"done # $* 將所有的參數看成一個單詞.echo "Entire arg list seen as single word."echoindex=1 # 重設計數(譯者注: 從1開始).echo "Listing args with \"\$@\":"for arg in "$@"doecho "Arg #$index = $arg"let "index+=1"done # $@ 把每個參數都看成是單獨的單詞.echo "Arg list seen as separate words."echoindex=1 # 重設計數(譯者注: 從1開始).echo "Listing args with \$* (unquoted):"for arg in $*doecho "Arg #$index = $arg"let "index+=1"done # 未引用的$*將會把參數看成單獨的單詞.echo "Arg list seen as separate words."exit 0
運行代碼:
$ bash test.sh
二、操作字串
1.字串長度
$ vim test.sh
輸入代碼:
#!/bin/bashstringZ=abcABC123ABCabcecho ${#stringZ} # 15expr length $stringZ # 15
運行代碼:
$ bash test.sh
2.使用awk來處理字串
Bash指令碼也可以調用awk的字串操作功能來代替它自己內建的字串操作。
例子:提取字串
$ vim test.sh
輸入代碼:
#!/bin/bashString=23skidoo1# 012345678 Bash# 123456789 awk# 注意不同的字串索引系統:# Bash的第一個字元是從'0'開始記錄的.# Awk的第一個字元是從'1'開始記錄的.echo ${String:2:4} # 位置 3 (0-1-2), 4 個字元長# skid# awk中等價於${string:pos:length}的命令是substr(string,pos,length).echo | awk '{ print substr("'"${String}"'",3,4) # skid}'# 使用一個空的"echo"通過管道傳遞給awk一個假的輸入,#+ 這樣就不必提供一個檔案名稱給awk.exit 0
運行代碼:
$ bash test.sh