readonly 相當於C中的const,readonly將變數設為只讀模式,任何針對他們的賦值都是錯誤的 export 修改或列印環境變數,可以將變數放在環境里,放到環境里的變數可供所有的進程通過環境共用 unset 刪除變數 刪除變數var_name 刪除其他變數 刪除函數 shift 用來截去 ...
readonly
相當於C中的const,readonly將變數設為只讀模式,任何針對他們的賦值都是錯誤的
export
修改或列印環境變數,可以將變數放在環境里,放到環境里的變數可供所有的進程通過環境共用
PATH=$PATH:/usr/local/bin
export PATH
unset
刪除變數
unset var_name
刪除變數var_name
unset -v first middle last
刪除其他變數
unset -f fcn
刪除函數
shift
用來截去來自列表的位置參數,從左側開始,一旦執行shift,$1
的初始值就會永遠消失,取而代之的是$2
的舊值,依次類推,$#
的值也會依次減1
shift也可以帶一個參數,表示一次截取的個數
set
設置新的位置參數
替換
如果將:
去掉,則只檢查變數是否存在,不檢查是否"非null"
${var:-word}
表示如果var存在且非null,則返回其值,否則返回word
${var:=word}
表示如果變數存在切不是null,則返回其值,否則將其設置為word並返回
${var:?message}
表示如果var存在且不是null,則返回其值,否則退出並顯示var:message
${var:+word}
表示如果var存在且不是null,則返回word,否則返回null
匹配
${var#pattern}
匹配變數的開頭,刪除匹配的最短部分,返回剩下的
${var##pattern}
匹配於變數的開頭,刪除匹配的最長部分,返回剩下的
${var%pattern}
匹配變數的結尾,刪除匹配的最短部分,返回剩下的
${var%%pattern}
匹配變數的結尾,刪除匹配的最長部分,返回剩下的
例子
$PWD=`pwd`
$echo "$PWD"
/home/linux/Desktop/homework/161013
$echo "${PWD#/*/}"
linux/Desktop/homework/161013
$echo "${PWD##/*/}"
161013
$echo "${PWD%/*}"
/home/linux/Desktop/homework
$echo "${PWD%%/*}"
$
自定義變數
變數不需要聲明,隨用隨定義
var="Hello Shell"
cur_ver=1.1
echo "$var"
echo "$variable" #解釋器會去尋找**variable**這個變數,但這個變數是不存在的,沒有值
echo "${var}iable"
echo "\$cur_ver = $cur_ver"
VAR=`echo TESE` #將一個命令的結果賦值給變數VAR,也可以寫成VAR=$(echo TESE),參見<<變數替換>>
echo "$VAR"
輸出的結果:
hello shell
hello shelliable
$cur_ver = 1.1
TESE
$name="Mr. XJ" #不能寫name =
$echo $name
Mr. XJ
$[ $name == "XJ" ]
bash: [: too many arguments #shell變數只會進行字元串的替換,這句話會變成$[ Mr. XJ == "XJ" ] ,Mr. XJ中間的空格會導致出錯
$[ "$name" == "XJ" ] #這才是正確寫法
位置變數
既指shell腳本的命令參數,也指函數的內部傳入的參數,當參數值大於9時,需要使用{}括起來
- shell script將執行的命令放在存儲在
$0
,命令之後的參數依次存儲在$1
,$2
...,利用這些變數,就可以編寫帶參數的腳本 - 定義函數的參數列表也使用
$1
,$2
etc,註意與命令行的參數相區分,函數內的$1
etc是用來傳參的,但$0
還是保持原來的含義
預定義變數
$#
代表命令後接的參數的個數,多用在迴圈中
while [ $# != 0 ]
do
case $1 in
...
esac
shift
done
$@
代表命令後接的每一個參數字元串,類似"$1
", "$2
", "$3
".$*
代表命令後接的參數的集合字元串,類似"$1c$2c$3
", c為分隔符,預設為空格鍵,加上" "
表示一個字元串,不加和$@
一樣
Note:這兩個參數可以用來將參數傳遞給其他腳本或函數
for i in $*
do
echo "$i"
done
$?
IMPORTANT,只和上一條命令有關- 如果上一條命令的執行成功,裡面的值是0,否則裡面的值是一個正數
- 上一條test語句的返回結果,如果test結果為真,則為0,如果test結果為假,則為1
- shell的函數的返回值只能使用
$?
接收
內嵌變數
#
目前進程的參數個數,參見$#
@
傳遞給當前進程的命令行參數,置於雙引號內,會展開為個別的參數,參見$@
*
當前進程的命令行參數,參見$*
-
在引用時給予shell的選項?
前一個命令的退出狀態,參見$?
$
shell的進程編號,參見$$
0
shell程式的名稱!
最近一個後臺命令的進程編號,以此方式存儲進程編號,可通過wait供之後使用ENV
一旦引用則僅用於互動式shell中,展開為讀取和啟動時要執行的第一個文件的完整路徑名稱HOME
表示家目錄IPS
分隔符,預設為空格,tab和換行LANG
當前locale的預設名稱,可被LC_*
變數覆蓋LC_ALL
當前locale的名稱,會覆蓋LANG
和其他LC_*
變數LC_COLLATE
用來排序字元的當前locale的名稱LC_CTYPE
在模式匹配期間用來確定字元類別的當前locale的名稱LC_MESSAGES
輸出信息的當前語言的名稱LINENO
剛執行過的行在腳本或函數的行編號NLSPATH
在$LC_MESSAGES
所給定的信息里,信息目錄的位置PPID
父進程的PIDPS1
主要的命令提示符,預設是$
PS2
行繼續的命令提示符,預設是>
PS4
set +x 設置的執行跟蹤的提示字元串,預設是+
PWD
當前的工作目錄
~ $echo $LANG
en_AU.UTF-8
~ $echo "$LINENO"
8
~ $echo "$PATH"
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/linux/toolchain/gcc-4.6.4/bin:.
~ $echo "$PPID"
2647
~ $echo "$PWD"
/home/linux
~ $ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
linux 2647 0.0 2.2 110152 11540 ? Rl 07:51 0:01 gnome-terminal