Categories: Linux

Bash 程式設計教學與範例:讀取命令列參數數量與內容

介紹如何在 Bash 指令稿中透過 $#$*$@$1$2$3 等特殊變數取得命令列的參數個數與內容。

在一般的程式語言中,都可以透過 argc 與 argv 這類的特殊變數來取得命令列中指定的參數個數與內容,而在 Bash 指令稿中對應的特殊變數則為 $#$*$@,以下是這些變數的使用方式。

$# 取得命令列參數個數

在 Bash 中對應 argc 的變數為 $#,以下是使用範例:

#!/bin/bash
# 命令列參數個數(對應 argc)
echo "參數個數:$#"

假設此指令稿名稱為 script.sh,則實際執行的狀況如下:

bash script.sh dog cat
參數個數:2

檢查命令列參數個數

實務上在指令稿的開頭會先檢查參數的數量是否正確,若參數的數量有誤,則顯示錯誤訊息以及使用說明等資訊,以下是一個簡單的範例:

#!/bin/bash
# 設定命令列參數個數
ARG_NUM=2

# 檢查參數個數
if [ $# -ne $ARG_NUM ]; then
  echo "參數個數錯誤:$#"
  echo "參數個數應為:$ARG_NUM"
  exit 1
fi

echo "參數個數正確,執行後續動作..."

假設此指令稿名稱為 argnum.sh,則實際執行的狀況如下:

bash argnum.sh dog
參數個數錯誤:1
參數個數應為 2
bash argnum.sh dog cat
參數個數正確,執行後續動作...

$*$@ 取得命令列參數內容

若需要取得執行 Bash 指令稿時所指定的參數內容,可以透過 $*$@ 變數,這兩個變數都可以用來取得各個參數的內容,但有一些差異:

  • $*:單一字串,由所有參數以空白串接而成。
  • $@:陣列,包含所有參數。
$* 在串接各個參數時,事實上是以 $IFS 變數的第一個字元作為分隔字元,而 $IFS 變數的預設值是空白字元。

由於 $* 是將所有參數串接成一個字串,當參數內容包含空白時,可能會造成參數內容的混淆,因此通常建議是使用 $@ 來取用各個參數。

#!/bin/bash
# 逐一處理各參數
for a in "$@"; do
  echo "<$a>";
done

假設此指令稿名稱為 arg.sh,則實際執行的狀況如下:

bash script.sh dog cat bird fish
<dog>
<cat>
<bird>
<fish>

若參數內容包含空白,以 $@ 的方式也能正確處理:

bash script.sh dog "cat bird" fish
<dog>
<cat bird>
<fish>

$1$2$3… 取得命令列參數內容

Bash 的 $1$2$3 這些特殊數字變數可以用來直接取得指定參數的內容,以下是使用範例:

#!/bin/bash
echo "第 1 個參數:$1"
echo "第 2 個參數:$2"
echo "第 3 個參數:$3"

假設此指令稿名稱為 arg2.sh,則實際執行的狀況如下:

bash script.sh dog cat bird
第 1 個參數:dog
第 2 個參數:cat
第 3 個參數:bird

while 逐一處理各參數

若要逐一處理各個參數,除了使用 for 迴圈之外,亦可使用 while 迴圈搭配 shift,每處理完第一個參數後,將處理完的第一個參數移除,直到所有參數都處理完為止:

#!/bin/bash
# 逐一處理各參數
while [ $# != 0 ]; do
  echo "<$1>"; # 印出目前的第一個參數
  shift        # 將目前的第一個參數移除
done

這個 while 版本的指令稿執行的結果跟 for 版本相同。

Share
Published by
Office Guide
Tags: Bash

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago