2017-04-27 45 views
1

包裝另外命令的參數巴什 - 包裝另外命令的參數

我有一個命令tool1,它分析的參數是這樣的:

#!/usr/bin/env bash 
# ... 
while [[ $# -ge 1 ]] 
do 
     key="$1" 
     case $key in 
       -o|--option) 
       OPT="$2" 
       shift 
       ;; 

       -u|--user) 
       USR="$2" 
       shift 
       ;; 

       -*) 
       echo -e "Unrecognized option: \"$key\"" && exit 1 
       ;; 

       *) 
       OTHERS+=("$1") 
       ;; 
     esac 
     shift 
done 
# ... 

我有tool2調用tool1。因此tool2將不得不將參數傳遞給tool1。它還可能需要處理相同的參數(--user

tool2樣子:

#!/usr/bin/env bash 
# ... 
while [[ $# -ge 1 ]] 
do 
     key="$1" 
     case $key in 
       -O|--option2) 
       opt2="$2" 
       shift 
       ;; 

       -u|--user) 
       USR="$2" 
       OTHERS+=("-u $2") 
       shift 
       ;; 

       -*) 
       echo -e "Unrecognized option: \"$key\"" && exit 1 
       ;; 
       *) 
       OTHERS+=("$1") 
       ;; 
     esac 
     shift 
done 

## Call tool1 with other parameters to pass 
bash tool1.sh ${OTHERS[@]} 
# ... 

綜上所述 --option2只有通過tool2使用的選項。 --user對於這兩種工具都很常見,在調用tool1.sh之前,也可以使用tool2。因此,在此示例中,--user必須明確傳遞給tool1,這要歸功於數組OTHERS

我想知道處理這種參數冗餘的可能和/或替代方法。一種方法可以幫助我打包另一個工具的預期參數/選項,而不必複製/粘貼關於分析這些冗餘參數/選項的行。

+0

爲什麼不使用'getopt'內建函數? – jehutyy

+0

關於可移植性問題。 'getopt'不是標準化的。 'getopts'然而不支持長選項。 – kaligne

+0

如果一個選項在第二個腳本中,但不是第一個腳本,該怎麼辦?同樣,如果兩個腳本都可以對參數進行操作,它是多餘的? – 123

回答

1

tool2的方法很好。但是,您沒有正確設置OTHERS

-u|--user) 
    USR="$2" 
    OTHERS+=("-u" "$2") 
    shift 

-u和它的參數需要保持獨立的數組元素,就如同它們是獨立的參數tool2。您還需要引用的OTHERS擴大,保存包含單詞拆分字符或水珠參數:

bash tool1.sh "${OTHERS[@]}" 

最後,全部大寫的變量名是保留給shell本身使用;不要自己定義這樣的名字。只需使用others而不是OTHERS

+0

感謝您的洞察力。大寫輸出變量的名字是好的,但是,對吧? – kaligne

+0

如果通過「大寫」,你的意思是「其他」。不過,請勿自行創建僅由大寫字母組成的變量。無論您是否導出變量都無關緊要。 – chepner

+0

好的原因,在一些官方文檔中,我確實已經讀過,聲明個人大寫變量(OTHER)僅在導出所述變量時是相關的。 – kaligne