1、位置參數變量的做用nginx
一句話歸納:咱們要從命令行、函數或者腳本執行等處傳遞參數時,就須要在shell腳本中使用位置參數變量shell
2、Shell中的特殊未知參數變量有哪些vim
1)$0
做用:獲取當前執行的shell腳本的腳本名字(若是腳本中包含了路徑,那獲取的就是腳本路徑)bash2)$n
做用:獲取當前執行的shell腳本的第n個參數(n=1..9),當n=0時,則就是$0獲取腳本名,當n≥10,則必須使用{},例如:${10},當n有多個時,則參數之間用空格隔開ide3)$#
做用:獲取當前執行的shell腳本後面接的參數的總個數函數4)$*
做用:獲取當前執行的shell腳本後面全部的參數,若是給$*加上雙引號,即"$*"時,則表示把全部的參數視爲不一樣的單個字符串,至關於:"$1 $2 $3"測試5)$@
做用:獲取當前執行的shell腳本後面全部的參數,若是給$@加上雙引號,即"$@"時,則表示把全部的參數視爲不一樣的獨立字符串,至關於:"$1" "$2" "$3",這種方式是把多參數傳遞給其餘程序的最佳方式,由於它會保留全部的內嵌在每一個參數裏的任何空白命令行特殊說明:當"$*"和"$@"都加雙引號時是有區別的,當二者都不加雙引號時,是徹底沒區別的rest
6)$?
做用:獲取執行上一個指令的執行狀態返回值(0爲成功,非0爲失敗,⭐️這個變量很是的經常使用⭐️)code7)$$
做用:獲取當前執行的shell腳本的進程號(即PID),不太經常使用,瞭解便可8)$!
做用:獲取上一個在後臺工做的進程的進程號,不太經常使用,瞭解便可9)$_
獲取在此以前執行的命令或腳本的最後的一個參數,相似於咱們使用的快捷鍵「esc+.」,由於是在非交互模式下,因此使用$_,通常經常使用,瞭解便可
3、分別舉例說明9個特殊位置參數變量
1)$0
[root@dabiaoge ~]# vim abc.sh
[root@dabiaoge ~]# cat abc.sh
echo $0
[root@dabiaoge ~]# sh abc.sh
abc.sh
[root@dabiaoge ~]# sh /root/abc.sh
/root/abc.sh
若是想單獨獲取腳本名或者路徑,則配合下面的小命令:
[root@dabiaoge ~]# basename /root/abc.sh
abc.sh
關於basename的詳細講解,請瀏覽地址:
http://www.javashuo.com/article/p-flqghlll-dr.html
[root@dabiaoge ~]# dirname /root/abc.sh
/root
關於dirname的詳細講解,請瀏覽地址:
http://www.javashuo.com/article/p-zfiywixm-dy.html
說明:若不帶路徑執行腳本,則輸出的結果就是腳本名;
若是使用全路徑執行腳本,那麼輸出的結果就是全路徑+腳本名2)$n
[root@dabiaoge ~]# vim abc.sh
[root@dabiaoge ~]# cat abc.sh
echo $1
[root@dabiaoge ~]# sh abc.sh dabiaoge
dabiaoge
[root@dabiaoge ~]# vim abc.sh
[root@dabiaoge ~]# cat abc.sh
echo $1 $2
[root@dabiaoge ~]# sh abc.sh dabiaoge dabiaoge2
dabiaoge dabiaoge2
[root@dabiaoge ~]# vim abc.sh
[root@dabiaoge ~]# cat abc.sh
echo $1 $2 $3
[root@dabiaoge ~]# sh abc.sh "dabiaoge dabiaoge2" dabiaoge3 dabiaoge4
dabiaoge dabiaoge2 dabiaoge3 dabiaoge4
說明:⑴參數與參數之間用空格隔開
⑵加引號括起來的參數會做爲一個字符串看待
[root@dabiaoge ~]# echo \${1..15} > num.sh
[root@dabiaoge ~]# cat num.sh
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@dabiaoge ~]# vim num.sh
[root@dabiaoge ~]# cat num.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@dabiaoge ~]# sh num.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
爲何會出現a0 a1 a2 a3 a4 a5,而不是字母呢?這是由於前面提過的,當n≥10,則必須使用{},例如:${10},請看下面:
[root@dabiaoge ~]# vim num.sh
[root@dabiaoge ~]# cat num.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
[root@dabiaoge ~]# sh num.sh {a..z}
a b c d e f g h i j k l m n o
說明:⑴當n≥10,則必須使用{}
⑵生產環境下規範的寫法是"$1" "$2" "$3",就是$n用雙引號括起來3)$#
[root@dabiaoge ~]# vim abc.sh
[root@dabiaoge ~]# cat abc.sh
echo $#
[root@dabiaoge ~]# sh abc.sh {a..z}
26
條件表達式判斷語句的寫法(例子):
[root@dabiaoge ~]# vim tt1.sh
[root@dabiaoge ~]# cat tt1.sh#!/bin/bash [ $# -ne 2 ] && { //「-ne」是不等於的意思,「-eq」是等於的意思 echo "必須兩個參數" exit 1 } echo dabiaoge_nb[root@dabiaoge ~]# sh tt1.sh dabiaoge1
必須兩個參數
[root@dabiaoge ~]# sh tt1.sh dabiaoge1 dabiaoge2
dabiaoge_nb
if判斷語句的寫法(例子):
[root@dabiaoge ~]# vim tt2.sh
[root@dabiaoge ~]# cat tt2.sh#!/bin/bash if [ $# -ne 2 ] then echo "用法:/bin/sh $0 參數1 參數2" //注意此處的$0,打印腳本名 exit 1 fi echo $1 $2[root@dabiaoge ~]# sh tt2.sh dabiaoge1
用法:/bin/sh tt2.sh 參數1 參數2
[root@dabiaoge ~]# sh tt2.sh dabiaoge1 dabiaoge2
dabiaoge1 dabiaoge24)$*和$@
舉例說明的材料:
[root@dabiaoge ~]# set -- "I am" big biaoge //「set --」表示清除全部的參數變量,從新設置後面的參數變量
[root@dabiaoge ~]# echo $#
3
[root@dabiaoge ~]# echo $1
I am
[root@dabiaoge ~]# echo $2
big
[root@dabiaoge ~]# echo $3
biaoge
測試①:二者都不帶雙引號
普通測試:
[root@dabiaoge ~]# echo $*
I am big biaoge
[root@dabiaoge ~]# echo $@
I am big biaoge
使用for循環測試:
[root@dabiaoge ~]# for i in $*;do echo $i;done
I
am
big
biaoge
[root@dabiaoge ~]# for i in $@;do echo $i;done
I
am
big
biaoge
說明:兩次測試結果二者徹底同樣,甚至「I am」這第一個參數也給分開了。
測試②:二者都帶雙引號
普通測試:
[root@dabiaoge ~]# echo "$*"
I am big biaoge
[root@dabiaoge ~]# echo "$@"
I am big biaoge
使用for循環測試:[root@dabiaoge ~]# for i in "$*";do echo $i;done I am big biaoge [root@dabiaoge ~]# for i in "$@";do echo $i;done I am big biaoge [root@dabiaoge ~]# for i;do echo $i;done I am big biaoge說明:當普通測試的時候仍是徹底沒區別,一旦使用for循環測試,就出現了不一樣之處。即:在for循環+雙引號的狀況下,$*和$@是不同的。
去掉"in 變量列表",至關於有引號的in "$@"。
5)$?
[root@dabiaoge ~]# pwd
/root
[root@dabiaoge ~]# echo $?
0
[root@dabiaoge ~]# ls /dabiaoge
ls: cannot access /dabiaoge: No such file or directory
[root@dabiaoge ~]# echo $?
2
說明:在生產環境下,$?返回值的用法:
①判斷命令、腳本或函數等程序是否執行成功
②若在腳本中調用執行「exit 數字」,則會返回這個數字給「$?」變量
③若是是在函數裏面,則經過「return 數字」把這個數字以函數返回值的形式傳給「$?」
6)$$
[root@dabiaoge ~]# vim test_pid.sh
[root@dabiaoge ~]# cat test_pid.sh
echo $$ > /tmp/abc.pid
sleep 300
[root@dabiaoge ~]# ps -ef | grep test_pid | grep -v grep
[root@dabiaoge ~]# sh test_pid.sh &
[1] 13107
[root@dabiaoge ~]# ps -ef | grep test_pid | grep -v grep
root 13107 3977 0 22:01 pts/0 00:00:00 sh test_pid.sh
[root@dabiaoge ~]# cat /tmp/abc.pid
13107
說明:經過ps看到的腳本的進程號13107與/tmp/abc.pid裏面的數字是同樣的,這就是靠$$傳參過來的值。
通常運用場景:有時執行定時任務腳本的頻率比較快,並不知道上一個腳本是否真的執行完畢,可是,業務要求同一時刻只能有一個一樣的腳本在運行,此時就須要利用$$來獲取上一次運行的腳本進程號,當程序從新運行時,根據獲取的進程號,清理掉上一次的進程。舉例腳本以下:
[root@dabiaoge ~]# cat pid.sh
#!/bin/bash pidpath=/tmp/ceshi.pid #若是pid文件存在,則執行then後面的命令 if [ -f "$pidpath" ] then #殺掉與前一個進程號對應的進程 kill $(cat $pidpath) > /dev/null 2&>1 rm -rf $pidpath fi echo $$ > $pidpath sleep 300
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
[root@dabiaoge ~]# sh pid.sh &
[1] 13580
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
root 13580 3977 0 22:13 pts/0 00:00:00 sh pid.sh
[root@dabiaoge ~]# sh pid.sh &
[2] 13592
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
root 13592 3977 0 22:13 pts/0 00:00:00 sh pid.sh
[1]- Terminated sh pid.sh
[root@dabiaoge ~]# sh pid.sh &
[3] 13603
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
root 13603 3977 0 22:13 pts/0 00:00:00 sh pid.sh
[2]- Terminated sh pid.sh
7)$!
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
[root@dabiaoge ~]# sh pid.sh &
[1] 13806
[root@dabiaoge ~]# echo $!
13806
[root@dabiaoge ~]# ps -ef | grep pid.sh | grep -v grep
root 13806 3977 0 22:18 pts/0 00:00:00 sh pid.sh
說明:$!的功能相似於$$,只不過做用是獲取上一次執行腳本的pid
8)$_[root@dabiaoge ~]# systemctl restart nginx.service[root@dabiaoge ~]# systemctl restart nginx.service[root@dabiaoge ~]# echo $_nginx.service說明:$_就是上一條命令的最後一個參數值。