shell腳本中的$0、$n、$#、$-、$?、$!、$$、$*、$@等和shift
??我們寫別人shell腳本的時候,常會看到$0、$?、$!、$$、$*、$#、$@這樣的參數,他們表示什么含義呢?
??先看一段腳本打印一下日志:
#!/bin/bash
echo 當前執行腳本: $0
echo 參數個數: $#
echo 參數列表: $@
arguments=($@)
for i in $(seq 1 $#); do
echo 第$i個參數是: ${arguments[`expr $i - 1`]}
done
echo 參數列表: $*
arguments=($*)
for i in $(seq 1 $#); do
echo 第$i個參數是: ${arguments[`expr $i - 1`]}
done
echo 當前shell啟動時的選項標志: $-
echo 上一條命令執行后的狀態: $?
echo 當前shell的進程ID: $$
echo 這里在一個后臺進程輸出 &
echo shell最后一次運行的后臺進程ID: $!
??執行后得到結果:bash ./demo.sh a b c
??
說明:
$0 表示當前的執行腳本路徑,如果是絕對路徑,那么結果就是絕對路徑,如果是相對路徑,結果就是相對路徑
$# 表示腳本傳進來的時候的參數個數
$n n是大于0的正整數,表示第n個參數,比如$1表示第一個參數,$2表示第二個參數,$5表示第5個參數
$@ 參數列表,每個參數作為單獨引用
$* 參數列表,以一個單字符串顯示所有向腳本傳遞的參數
$? 當前shell上一個命令執行后的狀態,0表示成功正確執行,否則表示異常代碼
$$ 當前shell執行的進程ID
$! 當前shell最后一次啟動的后臺進程的ID
$- 當前shell的選項標志,表示當前shell的一些設置等,常見的返回結果有
i:交互模式
m:監控模式
B:使用括號展開
H:歷史擴展
x:跟蹤模式
v:verbose模式
K:禁止globbing(文件名擴展)
h:禁止hashing(命令查找優化)
??$@和$*
??這兩個經常拿來比較,相同點是都可以獲取到所有參數,卻別在于參數的傳遞方式不一樣,比如:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do echo $i; done
echo "-- \$@ 演示 ---"
for i in "$@"; do echo $i; done
??
??可以看到,$*把所有參數放到一個字符串里面視為一個參數了,而$@是將它們分開了,但是再未使用引號時,兩者作用是一樣的。
??在應用中,我們廠使用$@來傳遞參數,使用$*來打印內容:??
# 使用引號包著,表示把當前腳本的所有參數逐個傳遞
bash test.sh "$@"
# 打印或者在當前腳本使用
echo 參數列表:$*
??shift
??這里說下shift,因為我們在寫腳本時,往往會使用$@來傳遞所有的參數,但是往往我們可能有這種需求,我們需要傳遞的是$@參數列表從第二個參數開始的數據,因為第一個參數可能有特殊含義,這種做法在很多命令里面是很常見的,這個時候,shift可以幫助我們進行在參數列表中進行偏移,看下代碼就明白了
#!/bin/bash
echo 當前的參數列表:$*
echo 當前的參數列表:$@
shift
echo 當前的參數列表:$*
echo 當前的參數列表:$@
shift
echo 當前的參數列表:$*
echo 當前的參數列表:$@
??執行命令:bash demo.sh a b c d
??
一個專注于.NetCore的技術小白

浙公網安備 33010602011771號