我想編寫一個命令行工具,如git,它將遵循POSIX
標準。它將採取像--help
或-h
,--version
..等等的選項。但我沒有得到如何去做。任何人都可以告訴我如何使用bash腳本來做到這一點。請幫幫我。這對我來說是非常新鮮的東西。如何使用bash編寫命令行工具
例如:如果我的工具的名稱是檢查代碼,那麼我想使用工具;
Check-code --help
或
Check-code --version
我想編寫一個命令行工具,如git,它將遵循POSIX
標準。它將採取像--help
或-h
,--version
..等等的選項。但我沒有得到如何去做。任何人都可以告訴我如何使用bash腳本來做到這一點。請幫幫我。這對我來說是非常新鮮的東西。如何使用bash編寫命令行工具
例如:如果我的工具的名稱是檢查代碼,那麼我想使用工具;
Check-code --help
或
Check-code --version
有可能是一個更好的方式來做到這一點,但這裏是我發現有用: 每個參數由BASH的變量表示。第一個參數是$1
。第二個是$2
,依此類推。將選項字符串與第一個參數匹配,如果匹配,則相應地運行一些代碼。
實施例:
#!/bin/bash
if [ $1 == "--hello" ]
then
echo "Hello"
else
echo "Goodbye"
fi
如果在C或C++代碼,然後使用**argv
變量。 **argv
是一個雙指針,它包含傳遞給程序的所有參數的列表(其中argv[0]
是程序名)。
感謝您的答覆。我認爲我們可以使用bash命令「getopt 「。你能否使用它來提出上述解決方案。但我不知道它是否適用於「-h」和「--help」格式 – user1497818 2013-03-14 11:18:51
如果使用Bourne shell風格'test'(''''你應該引用''$ 1「'''。使用'[['不需要圍繞變量引號(但仍需要引用包含空格的文本)「。 – cdarke 2013-03-14 13:11:42
據我所知,「長選項」,如--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
我認爲這可以成爲實現多種選擇的途徑之一。使用getopt可以使我們簡短並且適用於短期和長期期權 – user1497818 2013-03-14 11:40:12
@ user1497818:非常困難,我看不到使用帶有長選項的'getopts'的方法。你可能更適合使用Perl和'Getopt :: Long' http://perldoc.perl.org/Getopt/Long.html – cdarke 2013-03-14 13:17:30
你可以在案例中檢測到一個破折號,並通過$ opt和$ 1(如果存在該選項的一個參數)來讓它處理。獲得的唯一優點是能夠處理作爲一組傳遞的多個單字母選項(例如-ine == -i -n -e)。我從來沒有任何人請求過我編寫的任何工具的能力,所以我從來沒有打擾過支持它。長/短的 – William 2013-03-14 14:11:29
您可以使用「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
這樣的長期選項。在實踐中,我從來沒有發現這是一個重大的限制;任何足夠複雜的腳本都需要很長的選項,這可能是我用另一種語言編寫的東西。
男人bash?或者買書? – 2013-03-14 10:56:34
http://stackoverflow.com/questions/8533029/bash-multiple-command-line-arguments-dependent-on-each-other?rq=1 – 2013-03-14 10:57:42