bash腳本內部變量
$BASH
bash的程序文件的路徑,如/bin/bash
$BASH_ENV
該環境變量保存一個Bash啟動文件路徑,當啟動一個腳本程序時會去讀該環境變量指定的文件。
例如可以設置
export BASH_ENV=./testScript
這里testScript的內容為
#!/bin/bash
echo $BASH_ENV
echo "Hello world!"
相當于我們每次運行一個bash腳本的時候都會去引用一下testScript這個文件。
運行的結果為:
Hello world!
./testScript
Hello world!
./testScript
相當于首先引用了一次testScript,打印出了前兩行,然后執行testScript,打印出了后兩行。我們可以利用這個變量引入一個文件來設置一些別名,設置一些常量之類。
$BASH_SUBSHELL
一個指示子shell(subshell)等級的變量。它是Bash版本3新加入的。
例如運行一下腳本:
#!/bin/bash
echo $BASH_SUBSHELL
( echo $BASH_SUBSHELL )
輸出內容為:
0
1
這里()用于使用子shell(subshell)來執行命令。
根據這個變量可以判斷子shell等級,進行例如變量作用域判斷之類的操作。
$BASH_VERSINFO[n]
這個數組含有6個元素,指示了安裝的Bash版本的信息。它和$BASH_VERSION相似,但它們還是有一些小小的不同。
# BASH_VERSINFO[0] = 3 # 主版本號.
# BASH_VERSINFO[1] = 00 # 次版本號.
# BASH_VERSINFO[2] = 14 # 補丁級.
# BASH_VERSINFO[3] = 1 # 編譯版本.
# BASH_VERSINFO[4] = release # 發行狀態.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # 結構體系
$BASH_VERSION
安裝在系統里的Bash版本
如運行
echo $BASH_VERSION
會得到
3.2.57(1)-release
$DIRSTACK
這個內建的變量和dirs命令相符,但dirs是給出整個目錄堆棧的內容。
$EDITOR
由腳本調用的默認的編輯器,一般是vi或是emacs。通常是沒有設置的空變量。
$EUID
有效用戶id
$FUNCNAME
當前函數的名字
例如運行以下bash腳本:
#!/bin/bash
function HelloWorld(){
echo $FUNCNAME
}
echo $FUNCNAME
HelloWorld
得到的輸出為:
HelloWorld
第一行為空,第二行為函數名。
$GLOBIGNORE
由通配符(globbing)擴展的一列文件名模式
$GROUPS
目前用戶所屬的組
這是一個當前用戶的group id的列表,記錄在/etc/passwd和/etc/group中
$HOME
用戶的家目錄
linux中如/home/username
mac中如/User/username
也即~表示的目錄
$HOSTNAME
在系統啟動時由一個初始化腳本中用hostname命令給系統指派一個名字。
$HOSTTYPE
機器類型
類似$MACHTYPE一樣表示系統硬件
echo $HOSTTYPE
x86_64
$IFS
內部字段分隔符,決定了bash如何分割字段,默認是空白符
運行腳本如下:
#!/bin/sh
function OutPutArgs(){
for arg
do
echo "[$arg]"
done
}
IFS=" "
var=" a b c "
OutPutArgs $var
IFS=":"
var="a::b:b:c"
OutPutArgs $var
結果如下:
[a]
[b]
[c]
[a]
[]
[b]
[b]
[c]
$IGNOREEOF
忽略EOF,在控制臺退出之前忽略所有的文件結尾標識
$LC_COLLATE
它常常在.bashrc或/etc/profile文件里被設置,它控制文件名擴展和模式匹配的展開順序。如果設置不當,LC_COLLATE會在文件名通配符(filename globbing)里引起不可預料的結果。
到Bash2.05版本止,文件名通配符不再區分在方括號里的字符串范圍中的大小寫了。例如,ls [A-M]*會匹配File1.txt和file1.txt。為了保持方括號區分大小寫的慣例,在/etc/profile文件和/或在~/.bashrc文件里由命令export LC_COLLATE=C把LC_COLLATE環境變量設置成C可以達到目的。
$LINENO
表示當前變量在shell腳本中的行數,可以用于調試shell腳本。
$MACHTYPE
機器類型
如:
echo $MACHTYPE
x86_64-apple-darwin15
$OLDPWD
上一次的工作目錄,即運行cd -
所到達的目錄
$OSTYPE
操作系統類型
如:
echo $OSTYPE
darwin15
$PATH
可執行程序的搜索路徑
當給出一個命令時,shell會自動在一個哈希表里搜索由PATH變量里所列的路徑尋找該命令程序。$PATH變量被保存在環境變量里,是一串由冒號(:)分割的目錄名的列表。通常,系統把此變量的值在/etc/profile文件和/或在~/.bashrc文件中被定義賦值。
PATH=${PATH}:/opt/bin 能把/opt/bin目錄加到當前現有的目錄列表中去。在一個腳本中,它可以用這種方法臨時地加一個目錄到目錄列表中去。當一個腳本退出時,此變量會恢復回原先的$PATH值(子進程不能改變父進程的環境變量)。
保存在$PATH目錄列表中的當前"工作目錄"(./)通常因為會引發安全漏洞而被忽略。因此search path中通常沒有工作目錄。
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
$PIPESTATUS
此數組變量保存了最后執行的前臺管道的退出狀態。它不一定和最后執行的命令的退出狀態一樣。
$PIPESTATUS數組的成員保存了每一個在管道里執行的命令各自的退出狀態。$PIPESTATUS[0]保存了管道里第一個命令的退出狀態,$PIPESTATUS[1]保存了管道里第二個命令的退出狀態,以此類推。
例如:
$ ls | aaa | wc
bash: aaa: command not found
0 0 0
$ echo ${PIPESTATUS[@]}
141 127 0
$PPID
一個進程的$PPID變量保存它的父進程的進程ID(pid)。
$PROMPT_COMMAND
這個變量在主提示符前($PS1顯示之前)執行它的值里保存的命令。
$PS1
這是主提示符(第一提示符),它能在命令行上看見。即每次輸入命令時前面的那些內容。
$PS2
副提示符(第二提示符),它在期望有附加的輸入時能看見。它顯示像">"的提示。即如果輸一條命令如
for i in a
然后回車。通常我們看見的是>符號。即PS2。
$PS3
第三提示符。它在一個select循環里顯示
例如運行以下腳本:
#!/bin/bash
PS3='Choose one:'
select vegetable in "beans" "carrots"
do
echo "Your choose is ${vegetable}"
break
done
exit 0
運行結果類似:
1) beans
2) carrots
Choose one:1
Your choose is beans
$PS4
第四提示符,它在用-x選項調用一個腳本時的輸出的每一行開頭顯示。它通常顯示像"+"的提示。
$PWD
工作目錄。類似于內建命令pwd
$REPLY
沒有變量提供給read命令時的默認變量.這也適用于select命令的目錄,但只是提供被選擇的變量項目編號而不是變量本身的值
例如執行以下腳本:
#!/bin/bash
echo -n "Input a:"
read
echo "a is: $REPLY"
read -p "b is :" b
echo "b is: $b"
echo "REPLY is :$REPLY"
得到的結果如下:
Input a:a
a is: a
b is :b
b is: b
REPLY is :a
$SECONDS
腳本已運行秒數
$SHELLLOPTS
已經激活的shell選項列表,它是一個只讀變量
$SHLVL
SHELL的嵌套級別.指示了Bash被嵌套了多深.在命令行里,$SHLVL是1,因此在一個腳本里,它是2.
$TMOUT
如果$TMOUT環境變量被設為非零值時間值time,那么經過time這么長的時間后,shell提示符會超時.這將使此shell退出登錄.
在Bash版本2.05b以上,可以在腳本中把$TMOUT和read命令結合使用
有其他更復雜的在腳本中實現定時輸入的方法.另一個方法是設置一個定時循環,超時時給腳本發送一個信號.這個辦法要求有一個處理例程來捕捉(trap)由定時循環產生的信號
$UID
用戶ID號
這是當前用戶的用戶標識號,它在/etc/passwd文件中記錄。
這是當前用戶的真實ID,即使只是臨時通過su命令轉換成另外一個用戶也會顯示成轉換成的ID號。$UID是個只讀變量,不能在命令行或是腳本中更改它,并且它和內建命令id是有些相似的。
位置參數
$0, $1, $2,等等
位置參數由命令行傳給腳本或傳給一個函數,或設置(set)給一個變量
$##
命令行參數[]或者是位置參數的數量
$*
所有的位置參數都被當成單個單元。
"$*"必須被引號引起來
$@
和$*相同,但每個參數都是一個引起的字符串。那是說,參數都是沒有被解析或擴展,是完整無缺地被傳遞的。這是說在參數列表中的每一個參數都被看作是一個單獨的單元。
"$@"應該被引號引起來。
其他特殊參數
$!
在后臺運行的最后一個作業的PID(進程ID)
$ echo aa & echo bb & echo $!
[1] 12875
[2] 12876
12876
$_
保存前一個命令最后一個參數的變量值
例如:
$ echo a b c
a b c
echo $_
c
$ echo
$ echo $_
echo
$?
一個命令,函數或腳本自身的退出狀態碼,可以用于在腳本里判斷運行狀況。
$
腳本本身的進程PID。$$變量常被用于腳本中生成一個"唯一的"臨時文件名. 這通常比調用mktemp還要簡單。
Locale
Locale是linux系統中多語言環境的設置接口,Locale根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟件運行時的語言環境。
Locale是linux系統中多語言環境的設置接口,Locale根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟件運行時的語言環境。
locale把按照所涉及到的文化傳統的各個方面分成12個大類,這12個大類分別是:
1、語言符號及其分類(LC_CTYPE)
2、數字(LC_NUMERIC)
3、比較和排序習慣(LC_COLLATE)
4、時間顯示格式(LC_TIME)
5、貨幣單位(LC_MONETARY)
6、信息主要是提示信息,錯誤信息,狀態信息,標題,標簽,按鈕和菜單等(LC_MESSAGES)
7、姓名書寫方式(LC_NAME)
8、地址書寫方式(LC_ADDRESS)
9、電話號碼書寫方式(LC_TELEPHONE)
10、度量衡表達方式 (LC_MEASUREMENT)
11、默認紙張尺寸大小(LC_PAPER)
12、對locale自身包含信息的概述(LC_IDENTIFICATION)。
例如:
$ locale
LANG="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_ALL=
設定locale就是設定12大類的locale分類屬性,即12個LC。除了這12個變量可以設定以外,為了簡便起見,還有兩個變量:LC_ALL和LANG。它們之間有一個優先級的關系:LC_ALL > LC >LANG。可以這么說,LC_ALL是最上級設定或者強制設定,而LANG是默認設定值。