2017-04-16 29 views
1

在shell腳本中,可能是bash,我們如何獲取許多相同類型的參數並將它們添加到內部數組中?舉例如下:在shell腳本中使用許多相同類型的cli參數?

./combine -f file1 -f file2 -f file3 -o output_file 

我知道這個簡單的問題可以通過cat和單獨的重定向來解決。但我感興趣的是如何讓bash說我們可以將-f參數的全部三個都放在一個數組中,以便我們可以對它們做些什麼?

由於要求的性質,我們需要某種形式的標誌,因爲會有其他參數。

在像Python這樣的語言中,它相當容易,特別是像docopt這樣的庫。您可以按照預期指定一個數組,然後就完成了。

非常感謝

回答

6

您可以使用getopts

#!/bin/bash 

while getopts "f:o:" opt; do 
    case $opt in 
     f) file+=("${OPTARG}") ;; 
     o) output="${OPTARG}" ;; 
     *) exit 1 ;; 
    esac 
done 
shift $((OPTIND-1)) 

echo "List of files: \"${file[@]}\"" 
echo "Output: \"$output\"" 

因此,例如:

$ bash test.sh -f 1 -f 2 -f three -o /dev/null 
List of files: "1 2 three" 
Output: "/dev/null" 

所以我在做什麼是增加每個-f標誌的每一次出現,以一個數組file,然後簡單地打印它。至於-o我只是將輸入保存到變量output。其他任何事情都會導致getopts的退出並退出:

$ bash test.sh -w hi 
test.sh: illegal option -- w 
$ echo $? 
1