Bash
使用 getopt 的帶有可選輸入參數的 bash 腳本
我從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/
. 空間不是必需的,是允許的。