1. 程式人生 > >shell的特殊重要內建變數

shell的特殊重要內建變數

《1》位置變數

$0 獲取當前執行的shell指令碼的檔名,如果執行指令碼帶路徑,那麼就包括指令碼路徑。

$n 獲取當前執行shell的命令列的第n個引數,當n=0時表示指令碼的檔名,如果n>9,用{}將其括起來,引數以空格隔開。

$# 獲取當前執行的shell指令碼後面接的引數的總個數。

[root@localhost SHELL]# vim test.sh 
[root@localhost SHELL]# sh test.sh "how are you" hello
how are you hello 2 test.sh
[root@localhost
SHELL]# cat test.sh echo $1 $2 $# $0 [root@localhost SHELL]# ///////////////////加引號與否 [root@localhost SHELL]# vim test.sh [root@localhost SHELL]# sh test.sh how are you how are [root@localhost SHELL]# sh test.sh "how are you" hello how are you hello [root@localhost SHELL]# cat test.sh echo $1 $2

$*
$@

$

@ 與 $* 的區別:
$* 將命令列的所有引數視為一個單獨的字串,等同於”$1$2$3”,”$*”

$@ 將命令列的每個引數視為單獨的字串,等同於”$1”, “$2”, “$3”.

dirname 與 basename

dirname 獲取檔案的路徑名
basename 獲取檔案的名稱

[root@localhost SHELL]# dirname /root/Desktop/SHELL/test.sh 
/root/Desktop/SHELL
[root@localhost SHELL]# basename /root/Desktop/SHELL/test.sh 
test.sh [root@localhost SHELL]#

$0的使用驗證
這裡寫圖片描述

《2》程序狀態變數

$? 獲取執行上一個指令的返回值(0表示成功,非0表示失敗)

[root@localhost SHELL]# echo $?
0
[root@localhost SHELL]# sh test1.sh 
ni hao, ming tian
[root@localhost SHELL]# echo $?
0
[root@localhost SHELL]# cat test1.sh 
echo 'ni hao, ming tian'
[root@localhost SHELL]# 

$? 的返回值的意義:

0 執行成功
2 許可權不夠
1~125 執行失敗
126 找到該命令了,但是無法執行
127 未找到要執行的命令
大於128 命令被系統強制中斷

提示: 在指令碼中一般用 exit 數字,在執行指令碼後,返回返回值給$?;;;; 在函式裡用return 數字 返回返回值給$?

$! 獲取執行上一個指令的PID
$$ 獲取當前shell的程序號(PID)

[root@localhost SHELL]# sh test1.sh 
ni hao, ming tian
[root@localhost SHELL]# echo $$
5964
[root@localhost SHELL]# cat test1.sh 
echo 'ni hao, ming tian'
[root@localhost SHELL]# 

/////////////////
[root@localhost SHELL]# vim test.sh 
[root@localhost SHELL]# sh test.sh &
[2] 7733
[root@localhost SHELL]# cat /tmp/a.pid 
7733
[root@localhost SHELL]# cat test.sh 
echo $$ >/tmp/a.pid
sleep 200
[root@localhost SHELL]# 

$_ 獲取在此之前執行的命令或指令碼的最後一個引數

[root@localhost SHELL]# ls ./
test1.sh  test.sh  UNIX.shell範例精解(第4版).pdf
[root@localhost SHELL]# echo $_
./
[root@localhost SHELL]# 

//////////////////
[root@localhost SHELL]# cat test.sh 
echo $1 $2 $# $0
[root@localhost SHELL]# echo $_
test.sh
[root@localhost SHELL]# sh test.sh hello world
hello world 2 test.sh
[root@localhost SHELL]# echo $_
world
[root@localhost SHELL]#