特殊變量
在Shell中的特殊變量主要分別兩種位置參數變量、狀態變量兩種。
位置參數變量
Shell中的位置參數變量主要是指0、0、1、$#等,主要用于從命令行、函數或腳本執行等地方傳遞參數。詳細說明如下所示:
當"∗"和"∗"和"@"都添加雙引號時,兩者的功能有所區別;如不加,則功能相同,無區別。
位置參數變量示例
1、示例一:
[root@localhost Test]# cat para.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}echo '$0 is:' $0echo '$1 is:' $1echo '$12 is:' ${12}echo '$# is:' $#echo '$* is:' $*echo '"$*"is:' "$*"echo '$@ is:' $@echo '"$@"is:' "$@"# 輸出結果[root@localhost Test]# bash ~/Test/para.sh {a..z}a b c d e f g h i j k l m n o$0 is: /root/Test/para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z
1、傳入的參數個數多于腳本定義的參數時,則多出的參數會忽略
2、傳入的參數中如使用雙引號,則會當作一個參數值進行傳遞
3、位置參數如大于9,需要使用${}進行傳遞
2、示例二:
[root@localhost Test]# cat testposition.sh #!/bin/bashecho '$# $1 $2 $3 $* $@'echo $# $1 $2 $3 $* $@echo "************"echo '$*'for tmp in $* do echo $tmp doneecho "************"echo "@@@@@@@@@@@@"echo '$@'for temp in $@ do echo $temp doneecho "@@@@@@@@@@@@"echo '"*"*"*"*"*"*'echo '$*'for i in "$*" do echo $i doneecho '"*"*"*"*"*"*'echo '"@"@"@"@"@"@'echo '$@'for j in "$@" do echo $j doneecho '"@"@"@"@"@"@'[root@localhost Test]# bash testposition.sh "Hello Jack" Welcome "to Shanghai"$# $1 $2 $3 $* $@3 Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai************$* # 未加雙引號,所以會輸出全部參數,則第一個和第三個參數會拆開HelloJackWelcometoShanghai************@@@@@@@@@@@@$@ # 未加雙引號,所以會輸出全部參數,則第一個和第三個參數會拆開HelloJackWelcometoShanghai@@@@@@@@@@@@"*"*"*"*"*"*$* # 添加雙引號后,傳入的參數全部當一個參數進行輸出Hello Jack Welcome to Shanghai"*"*"*"*"*"*"@"@"@"@"@"@$@ # 添加雙引號后,傳入的參數全部當獨立的參數進行輸出Hello JackWelcometo Shanghai"@"@"@"@"@"@
狀態變量
以上四個狀態變量,僅$?常用,其他三個了解即可。
在日常使場景中,$?主要用法如下所示:
1、判斷命令和腳本是否執行成功
2、如腳本中調用exit 數字,則會返回該數字給$?
3、如在函數中,則可以通過return 數字將該數字返回給$?
狀態變量示例
1、$?示例:
[root@localhost Test]# ll /etc/profile-rw-r--r--. 1 root root 1819 4月 11 2018 /etc/profile[root@localhost Test]# echo $?0[root@localhost Test]# ll /etc/profildls: 無法訪問/etc/profild: 沒有那個文件或目錄[root@localhost Test]# echo $?2
2、$$示例:
[root@localhost Test]# cat testPID.sh#!/bin/bashecho $$ > /tmp/test.pidsleep 300[root@localhost Test]# bash testPID.sh & # 將當前腳本調用到后臺執行[1] 1671[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 1671 23706 0 16:37 pts/0 00:00:00 bash testPID.sh # 查詢PID
3、!示例:!示例:!功能類似于$$,只不過是獲取上一次執行腳本的PID
[root@localhost Test]# bash testPID.sh &[1] 24078[root@localhost Test]# echo $!24078 # 打印上一次在后臺執行的進程號[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 24078 23706 0 16:42 pts/0 00:00:00 bash testPID.sh
4、$_示例:
[root@localhost Test]# bash para.sh {a..z}a b c d e f g h i j k l m n o$0 is: para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z[root@localhost Test]# echo $_z # 打印最后一個傳入的參數值
Bash 內置變量
常用的內部命令有echo、eval、exec、export、read、shift、exit。
echo
主要用于打印信息,其命令格式如下所示:
echo [options] args
常用參數如下所示:
參數選項 | 說明 |
---|---|
-n | 不換行輸出內容 |
-e | 解析轉義字符 |
echo常用轉義字符如下:
轉義字符 | 說明 |
---|---|
/n | 換行 |
/r | 回車 |
/t | Tab |
/b | 退格 |
/v | 縱向制表符 |
eval
當Shell程序運行到eval語句時,將讀入參數args,并將它們組合成一個新的命令而后執行。其命令格式如下所示:
eval args
exec
exec主要用于在不創建新的子進程的情況下,轉而執行指定的命令,當指定命令執行完后,則終止該進程。其命令格式如下所示:
exec args
當使用exec打開文件后,read命令每次都會將文件指針移動到下一行進行讀取,直至結束。因此常用來處理文件內容。
read
從標準輸入讀取變量或字符串等信息并傳遞給其他變量,其命令格式如下所示
read args
shift
對傳入的位置參數依次向左移動一個位置,并使用位置參數$#減1,直至0為止。其命令格式如下所示:
shift postition args
shift如果不帶參數,則默認左移1位
如傳入的參數為112 3,如執行一次shift,則之前的3,如執行一次shift,則之前的3變成2,2,2變成1,1,1消失。
exit
常用于退出Shell,在日常使用過程中可使用exit num來自定義返回狀態數。
Bash 內置變量示例
1、echo
[root@localhost Test]# echo "Test";echo "Dao"TestDao[root@localhost Test]# echo -n "Test";echo "Dao"TestDao[root@localhost Test]# echo -e "Test/tName/n Dao"Test Name Dao
2、eval
[root@localhost Test]# cat eval.sh#!/bin/bashecho "No eval"echo /$$#echo "Add eval"eval echo /$$#[root@localhost Test]# bash eval.sh a bNo eval$2 # 未添加evel時,$#為2,則輸出$2Add evalb # 添加evel后,則重新對傳入的參數進行解析,則輸出傳入的第2個參數
3、exec
[root@localhost Test]# exec lseval.sh para.sh ping.sh testPID.sh testposition.sh[admin@localhost ~]$ # 在執行exec后則終止當前Shell進程,因此從root用戶退出到普通用戶# 與read一起讀取文件[root@localhost ~]# seq 5 > /tmp/rand.log[root@localhost ~]# cat /tmp/rand.log 12345[root@localhost Test]# cat exec.sh#!/bin/bashexec < /tmp/rand.logwhile read line do echo $line doneecho "Completed"[root@localhost Test]# bash exec.sh12345Completed
4、read
可以參考公眾號中read命令一文
5、shift
[root@localhost Test]# cat shift.sh#!/bin/bashecho $1 $2 $3 $4 $5until [ -z $1 ]do echo $@ shift 1done[root@localhost Test]# bash shift.sh {1..5}1 2 3 4 51 2 3 4 52 3 4 53 4 54 55
變量擴展
變量擴展說明
Shell中變量擴展說明如下所示:
其中${var:-word}、${var:=word}、${var:?word}、${var:+word}中的冒號也可以省略,則將變量為空或未賦值修改為未賦值,去掉了為空的檢測, 即運算符僅檢測變量是否未賦值
變量擴展示例
[root@localhost init.d]# var="This is test string"[root@localhost init.d]# echo $varThis is test string[root@localhost init.d]# echo ${var}This is test string[root@localhost init.d]# echo ${#var} # 統計字符長度19[root@localhost init.d]# echo ${var:5} # 從第5個位置開始截取字符is test string[root@localhost init.d]# echo ${var:5:2} # 從第5個位置開始截取2個字符is[root@localhost init.d]# echo ${var#This} # 從開頭刪除最短匹配的字符 isis test string[root@localhost init.d]# echo ${var##This} # 從開頭刪除最長匹配的字符 isis test string[root@localhost init.d]# echo ${var%g} # 從結尾刪除最短匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var%%g} # 從結尾刪除最長匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var/is/newis} # 替換第一個匹配的字符Thnewis is test string[root@localhost init.d]# echo ${var//is/newis} # 替換所有匹配到的字符Thnewis newis test string[root@localhost init.d]# echo $centos # 變量未定義[root@localhost init.d]# echo ${centos:-UNDEFINE} # 變量為空,返回UNDEFINEUNDEFINE[root@localhost init.d]# centos="CentOS"[root@localhost init.d]# echo ${centos:-UNDEFINE} # 變量已經定義,返回變量本身的值CentOS[root@localhost init.d]# unset centos # 取消變量值[root@localhost init.d]# echo $centos[root@localhost init.d]# result=${centos:=UNDEFINE}[root@localhost init.d]# echo $resultUNDEFINE[root@localhost init.d]# echo $centos # 變量值為空,則將UNDEFINE賦值給centosUNDEFINE[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:?can not find variable centos}-bash: centos: can not find variable centos # 變量值為空,輸出自定義錯誤信息[root@localhost init.d]# centos="IS DEFINED"[root@localhost init.d]# echo ${centos:?can not find variable centos}IS DEFINED #變量值已定義,則輸出變量值[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:+do nothing} # 變量值為空,什么都不操作輸出[root@localhost init.d]# centos="do"[root@localhost init.d]# echo ${centos:+do nothing} # 變量已賦值,則輸出自定義的消息do nothing
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答