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

位置參數變數的作用主要用於腳本的傳參。

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

位置參數變數如下:

位置參數變數 作用
$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