1. 程式人生 > >Shell中的特殊位置參數變量全文收錄

Shell中的特殊位置參數變量全文收錄

shell oot 之間 tro 執行 空白 定時 idp 單個

一、位置參數變量的作用

一句話概括:我們要從命令行、函數或者腳本執行等處傳遞參數時,就需要在shell腳本中使用位置參數變量

二、Shell中的特殊未知參數變量有哪些

1)$0
作用:獲取當前執行的shell腳本的腳本名字(如果腳本中包含了路徑,那獲取的就是腳本路徑)
2)$n
作用:獲取當前執行的shell腳本的第n個參數(n=1..9),當n=0時,則就是$0獲取腳本名,當n≥10,則必須使用{},例如:${10},當n有多個時,則參數之間用空格隔開
3)$#
作用:獲取當前執行的shell腳本後面接的參數的總個數
4)$
作用:獲取當前執行的shell腳本後面所有的參數,如果給
$
加上雙引號,即*"$

"時,則表示把所有的參數視為不同的單個**字符串,相當於:"$1 $2 $3"

5)$@
作用:獲取當前執行的shell腳本後面所有的參數,如果給$@加上雙引號,即"$@"時,則表示把所有的參數視為不同的獨立字符串,相當於:"$1" "$2" "$3",這種方式是把多參數傳遞給其他程序的最佳方式,因為它會保留所有的內嵌在每個參數裏的任何空白

特殊說明:當*"$""$@"**都加雙引號時是有區別的,當兩者都不加雙引號時,是完全沒區別的

6)$?


作用:獲取執行上一個指令的執行狀態返回值(0為成功,非0為失敗,??這個變量非常的常用??
7)$$
作用:獲取當前執行的shell腳本的進程號(即PID),不太常用,了解即可
8)$!
作用:獲取上一個在後臺工作的進程的進程號,不太常用,了解即可
9)$_
獲取在此之前執行的命令或腳本的最後的一個參數,類似於我們使用的快捷鍵“esc+.”,因為是在非交互模式下,所以使用$_,一般常用,了解即可

三、分別距離說明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://blog.51cto.com/zpf666/2335218
[root@dabiaoge ~]# dirname /root/abc.sh
/root
關於dirname的詳細講解,請瀏覽地址:
http://blog.51cto.com/zpf666/2335223
說明:若不帶路徑執行腳本,則輸出的結果就是腳本名;
如果使用全路徑執行腳本,那麽輸出的結果就是全路徑+腳本名
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)**$***和**$@**
br/>4)**$***和**$@**
[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
[root@dabiaoge ~]#
說明:兩次測試結果兩者完全一樣,甚至“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
說明:$_就是上一條命令的最後一個參數值。

Shell中的特殊位置參數變量全文收錄