5

bash のコマンド ライン引数の検証を行う再利用可能なコード スニペットを探しています。

Apache Commons CLI が提供する機能に似たものが理想的です。

Commons CLI は、さまざまなタイプのオプションをサポートしています。

  • POSIX ライクなオプション (つまり、tar -zxvf foo.tar.gz)
  • GNU のような長いオプション (つまり、du --human-readable --max-depth=1)
  • 値が付加された短いオプション (例: gcc -O2 foo.c)
  • ハイフンが 1 つの長いオプション (例: ant -projecthelp)
  • ...

次のように、プログラムの「使用法」メッセージが自動的に生成されます。

usage: ls
 -A,--almost-all          do not list implied . and ..
 -a,--all                 do not hide entries starting with .
 -B,--ignore-backups      do not list implied entried ending with ~
 -b,--escape              print octal escapes for nongraphic characters
    --block-size <SIZE>   use SIZE-byte blocks
 -c                       with -lt: sort by, and show, ctime (time of last
                          modification of file status information) with
                          -l:show ctime and sort by name otherwise: sort
                          by ctime
 -C                       list entries by columns

このコード スニペットを Bash スクリプトの先頭に含めて、スクリプト間で再利用します。

このようなものがあるはずです。私たち全員がこの効果または類似のコードを書いているとは思いません。

#!/bin/bash

NUMBER_OF_REQUIRED_COMMAND_LINE_ARGUMENTS=3

number_of_supplied_command_line_arguments=$#

function show_command_usage() {
  echo usage:
  (...)
}

if (( number_of_supplied_command_line_arguments < NUMBER_OF_REQUIRED_COMMAND_LINE_ARGUMENTS )); then
  show_command_usage
  exit
fi

...
4

1 に答える 1

6

これは私が使用するソリューションです(ネットのどこか、おそらくここ自体で見つけましたが、確かに覚えていません)。GNU getopt ( /usr/bin/getopt) はオプションを使用して一重鎖線の長いオプション (ant -projecthelpスタイル) をサポートしています-aが、私はそれを使用していないため、例には示されていません。

このコードは、 --host valueor -h value--port valueor -p value--table valueorの 3 つのオプションを解析します-t value。必要なパラメータが設定されていない場合は、そのテストが行​​われます

# Get and parse options using /usr/bin/getopt
OPTIONS=$(getopt -o h:p:t: --long host:,port:,table: -n "$0" -- "$@")
# Note the quotes around `$OPTIONS': they are essential for handling spaces in 
# option values!
eval set -- "$OPTIONS"

while true ; do
    case "$1" in
            -h|--host) HOST=$2 ; shift 2 ;;
            -t|--table)TABLE=$2 ; shift 2 ;;
            -p|--port)
                    case "$2" in
                            "") PORT=1313; shift 2 ;;
                            *)  PORT=$2; shift 2 ;;
                    esac;;
            --) shift ; break ;;
            *) echo "Internal error!" ; exit 1 ;;
    esac
done
if [[ -z "$HOST" ]] || [[-z "$TABLE" ]] || [[ -z "$PORT" ]] ; then
    usage()
    exit
if

シェル組み込みを使用した代替実装getopts(これは小さなオプションのみをサポートします):

while getopts ":h:p:t:" option; do
    case "$option" in
         h) HOST=$OPTARG ;;
         p) PORT=$OPTARG ;;
         t) TABLE=$OPTARG ;;
        *) usage(); exit 1 ;;
    esac
done
if [[ -z "$HOST" ]] || [[-z "$TABLE" ]] || [[ -z "$PORT" ]] ; then
    usage()
    exit
if

shift $((OPTIND - 1))

GNU getoptおよびgetopts bash ビルトインの詳細情報

于 2012-07-02T09:45:32.500 に答える