Bash

使用 getopt 的帶有可選輸入參數的 bash 腳本

  • January 13, 2021

我從tutorialspoint 的 getopt 文章中複製了程式碼,並讓以下腳本工作(有點):


##argument_script.sh
VARS=`getopt -o i::o:: --long input::,output:: -- "$@"`
eval set -- "$VARS"

# extract options and their arguments into variables.
while true ; do
   case "$1" in

       -i|--input)
           case "$2" in
               "") MAPPE='/default/input/here/' ; shift 2 ;;
               *) MAPPE=$2 ; shift 2 ;;
           esac ;;
       
           -o|--output)
           case "$2" in
               "") OUTPUTFOLDER='/default/input/here/' ; shift 2 ;;
               *) OUTPUTFOLDER=$2 ; shift 2 ;;
       esac ;;
       --) shift ; break ;;
   esac
done

echo "${MAPPE}"
echo "${OUTPUTFOLDER}"

#do something here..

也就是說,我有兩個可選參數標誌-i/--input-o/ -output。我目前的腳本有問題:

要覆蓋標誌的預設值,您需要在標誌後面寫上您想要的值,不要有任何空格。範例:如果我想傳遞/c/into-i/f/into -o,我需要將腳本稱為:bash argument_script.sh -i/c/ -o/f/。注意缺少的空格。如果我要編寫bash argument_script.sh -i /c/ -o /f/變數MAPPE並將OUTPUTFOLDER使用預設值。
腳本可以改寫嗎,所以傳入-i/的參數-o需要寫在空格後面(例如bash argument_script.sh -i /c/ -o /f/:)

您描述的行為是因為您:getopt. 只需將您的getopt行更改為此,它將起作用:

VARS=`getopt -o i:o: --long input:,output: -- "$@"`

然而,這是一種非常非常複雜的腳本編寫方式。這是一個更簡單的版本(還糾正了一些不良做法,例如大寫變數):

#!/bin/bash

##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"

mappe='/default/input/here/'
outputFolder='/default/input/here/'

# extract options and their arguments into variables.
for opt; do
   case "$opt" in
     -i|--input)
       mappe=$2
       shift 2
       ;;
     -o|--output)
       outputFolder=$2
       shift 2
       ;;
   esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"

您現在可以執行以下操作:

$ ./argument_script.sh -i /c/  -o /f/
mappe: /c/
out: /f/

請注意,如果您執行./argument_script.sh -i/c/ -o/f/. 空間不是必需的,是允許的。

引用自:https://unix.stackexchange.com/questions/628942