如何在 Bash 指令碼中傳遞命令列引數


引言

對於 Linux 系統管理員和開發人員來說,編寫 Bash 指令碼的能力非常重要。它使我們能夠自動化常規流程,輕鬆完成困難的流程。bash 指令碼最重要的方面之一是能夠在指令碼執行期間向其提供資訊。透過命令列引數,可以更改指令碼的行為,而無需更改其程式碼。

本文將討論在 bash 指令碼中使用命令列引數。我們將討論一些處理命令列引數的方法,並針對每種方法提供說明。閱讀完本文後,我們將能夠自信地在 bash 指令碼中使用命令列引數。

在命令列引數中使用位置引數

在 bash 指令碼中使用命令列引數最簡單的方法是使用位置引數。變數 $1 儲存第一個引數,變數 $2 儲存第二個引數,以此類推。

以下指令碼使用了位置引數 −

#!/bin/bash
echo "Name, $1"
echo “Age, $2”

讓我們檢視輸出。

$ ./hello.sh Somdeb 22

指令碼將返回以下結果 −

Name, Somdeb
“Age, 22”

"Getopts" 用於解析命令列引數

Getopts 是一個內建的外殼命令,它允許我們靈活、高效地解析命令列選項和引數。Getopts 使用 while 迴圈來遍歷每個命令列引數並解析其選項。

這裡有一個使用 getopts 的示例指令碼 −

#!/bin/bash
while getopts ":a:b:" opt; do
   case ${opt} in
      a )
         echo "Option -a stores the value: $OPTARG"
      ;;
      b )
         echo "Option -b htores the value: $OPTARG"
      ;;
      \? )
         echo "Wrong option: -$OPTARG" 1>&2
      ;;
      : )
         echo "Option -$OPTARG requires an argument." 1>&2
      ;;
   esac
done

此指令碼使用 getopts 命令轉換 -a 和 -b 命令列引數。每個選項字母后面的冒號 (:) 表示它需要一個引數。OPTARG 變數儲存選項引數的值,而 opt 變數儲存當前選項字母。

$ ./get.sh -a Golf -b Football

指令碼將返回以下結果 −

Option -a stores the value: Golf
Option -b htores the value: Football

在命令列引數中使用“迴圈”

迴圈用於重複迭代命令列輸入並對每個輸入執行特定操作。當我們需要分別分析每個引數或對每個引數執行特定操作時,此方法很有用。

下面是一個使用“for”迴圈遍歷命令列選項的指令碼示例 −

#!/bin/bash
for arg in "$@"; do
   echo "Processing argument: $arg"
   # perform some action with the argument here
done

在這個指令碼中,命令列引數都可以透過 $@ 變數訪問,並且每個引數都使用 for 迴圈進行迭代。在使用引數之前,我們會發出一個訊息,表示正在處理它。

讓我們執行指令碼 −

$ ./loop.sh Hello, Welcome to India.

指令碼將返回以下結果 −

Processing argument: Hello,
Processing argument: Welcome
Processing argument: to
Processing argument: India.

在這裡,指令碼只是為提供的每個輸入返回一個訊息。然而,我們可以輕鬆地更改指令碼,以便根據我們的特定需要對每個引數執行不同的操作。

"flags" 用於解析命令列引數

使用“flags”是使用命令列引數的另一種方式。

#!/bin/bash
flag_a=false
flag_b=false
while getopts "ab" opt; do
   case $opt in
   a)
      flag_a=true
      ;;
   b)
      flag_b=true
      ;;
   \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
   esac
done
if $flag_a; then
   echo "Option -a has been set"
fi
if $flag_b; then
   echo "Option -b has been set"
fi

此示例定義了兩個標誌,“flag_a”和“flag_b”,兩者都設定為“false”。

$ ./flags.sh -a -b
Option -a has been set
Option -b has been set

當我們不想提供引數值但仍想啟用或停用指令碼的特定行為或特性時,標誌很有用。此外,它們提高了命令列介面的使用者友好性,因為使用者不必記住位置引數的正確順序,並且可以開啟或關閉所需的選項。

結論

最後,我們討論瞭如何使用位置引數、getopts、shift、flag 和迴圈在 bash 指令碼中使用命令列引數。透過理解這些策略,我們可以開發出健壯靈活的指令碼,並實現各種流程自動化。透過使用本文中的知識和示例,我們可以在 bash 指令碼編寫方面變得精通。

更新於: 14-Jul-2023

387 瀏覽次數

開啟你的職業

完成課程,獲得認證

開始
廣告
© . All rights reserved.