2013-03-14 54 views
2

我想編寫一個命令行工具,如git,它將遵循POSIX標準。它將採取像--help-h,--version ..等等的選項。但我沒有得到如何去做。任何人都可以告訴我如何使用bash腳本來做到這一點。請幫幫我。這對我來說是非常新鮮的東西。如何使用bash編寫命令行工具

例如:如果我的工具的名稱是檢查代碼,那麼我想使用工具;

Check-code --help 

Check-code --version 
+2

男人bash?或者買書? – 2013-03-14 10:56:34

+1

http://stackoverflow.com/questions/8533029/bash-multiple-command-line-arguments-dependent-on-each-other?rq=1 – 2013-03-14 10:57:42

回答

0

有可能是一個更好的方式來做到這一點,但這裏是我發現有用: 每個參數由BASH的變量表示。第一個參數是$1。第二個是$2,依此類推。將選項字符串與第一個參數匹配,如果匹配,則相應地運行一些代碼。

實施例:

#!/bin/bash 
if [ $1 == "--hello" ] 
    then 
     echo "Hello" 
    else 
     echo "Goodbye" 
fi 

如果在C或C++代碼,然後使用**argv變量。 **argv是一個雙指針,它包含傳遞給程序的所有參數的列表(其中argv[0]是程序名)。

+0

感謝您的答覆。我認爲我們可以使用bash命令「getopt 「。你能否使用它來提出上述解決方案。但我不知道它是否適用於「-h」和「--help」格式 – user1497818 2013-03-14 11:18:51

+0

如果使用Bourne shell風格'test'(''''你應該引用''$ 1「'''。使用'[['不需要圍繞變量引號(但仍需要引用包含空格的文本)「。 – cdarke 2013-03-14 13:11:42

4

據我所知,「長選項」,如--help--version不是POSIX標準,而是GNU標準。對於命令行實用程序,POSIX標準說:

由連字符和單個字母或數字(如'a')組成的參數稱爲「選項」(或歷史上的「標誌」)。

爲了支持POSIX短期選項,值得了解getopts(網上有教程),但它不支持GNU long選項。

對於你滾長選項你自己:

filename=default 
while (($# > 0)) 
do 
    opt="$1" 
    shift 

    case $opt in 
    --help) 
     helpfunc 
     exit 0 
     ;; 
    --version) 
     echo "$0 version $version" 
     exit 0 
     ;; 
    --file) # Example with an operand 
     filename="$1" 
     shift 
     ;; 
    --*) 
     echo "Invalid option: '$opt'" >&2 
     exit 1 
     ;; 
    *) 
     # end of long options 
     break; 
     ;; 
    esac 

done 
+0

我認爲這可以成爲實現多種選擇的途徑之一。使用getopt可以使我們簡短並且適用於短期和長期期權 – user1497818 2013-03-14 11:40:12

+0

@ user1497818:非常困難,我看不到使用帶有長選項的'getopts'的方法。你可能更適合使用Perl和'Getopt :: Long' http://perldoc.perl.org/Getopt/Long.html – cdarke 2013-03-14 13:17:30

+1

你可以在案例中檢測到一個破折號,並通過$ opt和$ 1(如果存在該選項的一個參數)來讓它處理。獲得的唯一優點是能夠處理作爲一組傳遞的多個單字母選項(例如-ine == -i -n -e)。我從來沒有任何人請求過我編寫的任何工具的能力,所以我從來沒有打擾過支持它。長/短的 – William 2013-03-14 14:11:29

2

您可以使用「getopts的」內置,像這樣:

#!/bin/bash 

# Parse arguments 
usage() { 
    echo "Usage: $0 [-h] [-v] [-f FILE]" 
    echo " -h Help. Display this message and quit. 
    echo " -v Version. Print version number and quit. 
    echo " -f Specify configuration file FILE." 
    exit 
} 

optspec="hvf:" 
while getopts "$optspec" optchar 
do 
    case "${optchar}" in 
     h) 
      usage 
      ;; 
     v) 
      version 
      ;; 
     f) 
      file=${OPTARG} 
      ;; 
     *) 
      usage 
      ;; 
    esac 
done 

這隻適用於單個字符的選項,而不是像-help--help這樣的長期選項。在實踐中,我從來沒有發現這是一個重大的限制;任何足夠複雜的腳本都需要很長的選項,這可能是我用另一種語言編寫的東西。