天天看點

[Shell]特殊變量$0$#$*$@$?和指令行參數

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/73302312

1. 參數變量

特殊變量清單

變量 含義
$0 目前腳本的檔案名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的所有參數。
$@ 傳遞給腳本或函數的所有參數。被雙引号(" ")包含時,與 $* 稍有不同,下面将會講到。
$? 上個指令的退出狀态,或函數的傳回值。
$$ 目前Shell程序ID。對于 Shell 腳本,就是這些腳本所在的程序ID。

Example:

#!/usr/bin/env bash
echo "腳本的檔案名: $0"
echo "腳本第一個參數 : $1"
echo "腳本第二個參數 : $2"
echo "腳本所有參數: $@"
echo "腳本所有參數: $*"
echo "腳本參數個數 : $#"           

輸出:

xiaosi@yoona:~/code/openDiary/BaseOperation/src/main/sh$ sh sh_params.sh hotel vacation flight
腳本的檔案名: sh_params.sh
腳本第一個參數 : hotel
腳本第二個參數 : vacation
腳本所有參數: hotel vacation flight
腳本所有參數: hotel vacation flight
腳本參數個數 : 3           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB5688ef5ccc3a68fbec3df27fc43134b6%3Fmethod%3Ddownload%26read%3Dtrue#2-%E4%B8%8E-%E5%8C%BA%E5%88%AB 2. $* 與 $@ 差別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數,但是兩者之間是有差別的:

(1) $*,$@ ,均以 "$1" "$2" … "$n" 的形式輸出

(2) "$", "$@" ,但是"$" 會将所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;而"$@" 會将各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數

echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "-------------------------"
echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "-------------------------"
echo "print each param from \$@"
for var in $@
do
    echo "$var"
done
echo "-------------------------"
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "-------------------------"
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done           
$*= a b c
"$*"= a b c
$@= a b c
"$@"= a b c
-------------------------
print each param from $*
a
b
c
-------------------------
print each param from $@
a
b
c
-------------------------
print each param from "$*"
a b c
-------------------------
print each param from "$@"
a
b
c           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB5688ef5ccc3a68fbec3df27fc43134b6%3Fmethod%3Ddownload%26read%3Dtrue#3-%E9%80%80%E5%87%BA%E7%8A%B6%E6%80%81 3. $? 退出狀态

$? 可以擷取上一個指令的退出狀态。所謂退出狀态,就是上一個指令執行後的傳回結果。退出狀态是一個數字,一般情況下,大部分指令執行成功會傳回 0,失敗傳回 1。不過,也有一些指令傳回其他值,表示不同類型的錯誤。

sh xxx.sh
res=$?
if [[ ${res} -ne 0 ]]
then
    echo "---------------------------------------腳本執行不成功"
    exit 1
fi