『忘了再學』Shell基礎 — 16、位置引數變數

繁華似錦Fighting發表於2022-05-23

位置引數變數的作用主要用於指令碼的傳參。

位置引數變數的名稱和作用都是確定不能改變的,但是該變數的內容是可以更改的,也就是變數的值。

位置引數變數如下:

位置引數變數 作用
$n n為數字,$0代表命令本身,$1-$9代表(指令碼命令後的)第一到第九個引數,十以上的引數需要用大括號包含,如${10}${15}
$* 這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體。
$@ 這個變數也代表命令列中所有的引數,不過$@把每個引數區分對待。
$# 這個變數代表命令列中所有引數的個數。

1、位置引數變數$n

$nn為數字,$0代表命令本身,$1-$9代表(指令碼命令的)第一到第九個引數,十以上的引數需要用大括號包含,如${10}${15}。(這個是一個典型的向Shell指令碼當中傳遞值的方式)

(1)示例:

# 定義一個shell指令碼,簡單的計算器,求兩個數的和。

[root@Lyl tmp]# vim count.sh

# 指令碼內容如下:

#!/bin/bash

# 給num1變數賦值是第一個引數
num1=$1
# 給num2變數賦值是第二個引數
num2=$2

# 變數sum是變數num1加變數num2的(其實上邊的num1和num2的定義可以省略)
sum=$(($num1 + $num2))
# 注意:執行count.sh指令碼後的第一個引數會傳遞給$1,第二個引數會傳遞給$2,
# 然後$num1和$num2進行求和,再賦值給sum變數。
# 但是Shell中自定義變數的預設型別是字串型別,
# 而我們傳入的兩個數字型別的變數值,Shell預設都識別為字串型別。
# 而這個時候我們就需要$(( ))把這個兩個字串型別的數值括起來,
# Shell才能知道要進行數值運算,裡邊的引數都是數值(Shell運算子中會詳細講)。
# 而$( )是括系統命令的,然後把該命令執行的結果,賦值給前面的變數,這個我們要注意。


#列印變數sum的值
echo $sum
echo $0

# 執行該指令碼
[root@Lyl tmp]# chmod 755 count.sh
[root@Lyl tmp]# ./count.sh 22 66
88
./count.sh

(2)總結:

  • $1儲存的是執行Shell命令之後的第一個引數,
  • $2儲存的是執行Shell命令之後的第二個引數,
  • $0代表執行指令碼的命令,如上邊的./count.sh
  • 位置引數變數好處。
    其作用就是把執行指令碼命令後輸入的引數,傳入到指令碼中,使指令碼中的變數可以靈活取值。
  • 位置引數變數的缺點。
    如果是一個普通的Linux使用者,該指令碼並不是自己寫的。當你獲得該指令碼的時候,你是無法知道需要在指令碼後邊是否加引數,或者是加什麼引數,指令碼才能正確執行,是沒有任何提示的。
    所以用位置引數變數傳參,並不適合給普通使用者來使用,一般是寫的指令碼自己用的時候,用的比較多。

提示:

位置引數變數也可以給函式中傳參(其實就是自己給自己傳值)。

給普通使用者的指令碼,傳參的方式用read,會有提示,比較友好,我們之後說明。

2、位置引數變數$*$@

$*:這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體。

$@:這個變數也代表命令列中所有的引數,不過$@把每個引數區分對待。

(1)用法

我們先寫一個指令碼來展示一下位置引數變數$*$@的用法:

# 定義一個指令碼parameter.sh

[root@Lyl tmp]# vim parameter.sh


# 指令碼內容如下:

#!/bin/bash

# 使用$*代表所有的引數(所有引數整體對待)
echo "The parameters \$* is:$*"
# 使用也代表所有引數(所有引數分開對待)
echo "The parameters \$@ is:$@"



# 執行該指令碼
[root@Lyl tmp]# chmod 755 parameter.sh 
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $* is:11 22 33 44
The parameters $@ is:11 22 33 44

我們可以看到位置引數變數$*$@,都把執行指令碼命令後邊帶的引數列印出來了。

(2)區別

位置引數變數$\*$@的區別是,$*把所有引數當作一個整體,而$@是先把11賦值給$@,在把22賦值給$@,以此類推,是分開的。

我們通過下邊的例子來說明:

# 我們先簡單的來說一下for迴圈
# 簡單的for迴圈例子

for i in 1 2 3 4
        do
            echo $i
        done

# 說明:
# 在in後有幾個數或者說是以空格隔開的變數(因為預設都是字串型別),
# in後有幾個變數,這個for迴圈就迴圈幾次。
# 第一次迴圈,把第一個變數賦值給in前邊的變數i,然後進入迴圈操作。
# 這只是for迴圈的一種形式,知道流程即可,後邊會在詳細說明Bash中的for迴圈。
# do和done就類似於Java中for迴圈的大括號(先這樣理解就可以)。


# 寫一個for迴圈指令碼
[root@Lyl tmp]# vim for.sh


# 指令碼內容如下:

#!/bin/bash
for i in 1 2 3 4
    do
        echo $i
    done

# 執行該指令碼
[root@Lyl tmp]# chmod 755 for.sh
[root@Lyl tmp]# ./for.sh
1
2
3
4

示例區別:

# 定義一個指令碼param.sh
[root@Lyl tmp]# vim param.sh


# 指令碼內容如下:

#!/bin/bash

# 定義for迴圈,in後面有幾個值,for會迴圈多少次,
# 注意"S*"要用雙引號括起來,每次迴圈會把in後面的值賦予變數i,
# Shell把$*中的所有引數看成是一個整體,所以這個for迴圈只會迴圈一次。

for i in "$*"
    do
        # 列印變數i的值
        echo "迴圈了"$i
    done

echo "==============="

# Shell把$@中的每個引數都看成是獨立的,所以“$@"中有幾個引數,就會迴圈幾次。
# 注意兩個for迴圈的變數名最好不相同,以示區別。相同也沒關係。
for j in "$@"
    do
        # 列印變數j的值
        echo "迴圈了"$j
    done


# 執行該指令碼
[root@Lyl tmp]# chmod 755 param.sh
[root@Lyl tmp]# ./param.sh 11 22 33 44
迴圈了11 22 33 44
===============
迴圈了11
迴圈了22
迴圈了33
迴圈了44

圖示:

image

3、位置引數變數$#

$#:這個變數代表命令列中所有引數的個數。

示例:

# 定義一個指令碼parameter.sh

[root@Lyl tmp]# vim parameter.sh


# 指令碼內容如下:

#!/bin/bash

# 使用$#代表所有引數的個數
echo "The parameters \$# is:$#"


# 執行該指令碼
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $# is:4

相關文章