1行に複数のパラメータを持つBashメニュー

1行に複数のパラメータを持つBashメニュー

数日間検索しましたが、まだ答えが見つかりませんでした。あなたが私に正しい方向を教えてくれることを願っています。

1行で呼び出すオプションを含むbashスクリプトを書く方法を知りたいです。例: script.sh -a -b -c。選択していないパラメータは無視されます。

メニュー/オプションは次のとおりです。

-a description: something
-b description: something else
-c description: something different
-d description: something..

これを行う方法はありますか?

答え1

スイッチとパラメータを処理する一般的な方法は、getopts関数を使用することです。これは組み込み関数であり、bashbashのマニュアルページ()man bashでこれに関する情報を見つけることができます。

getoptsデフォルトでは、どのパラメータが必要か、パラメータが必要かどうかを示す文字列を宣言します。getopts多数の引数(例:-abc同等物-a -b -c)とコマンドライン解析を処理します。処理が完了したら、getopts残りのコマンドラインを必要に応じて処理できます。

一般的なスクリプトスニペットは次のとおりです。

ARG_A= FLAG_B= FLAG_C=
while getopts 'a:bc' OPT    # -a {argument}, -b, -c
do
    case "$OPT" in
        a)    ARG_A="$OPTARG" ;;
        b)    FLAG_B=yes ;;
        c)    FLAG_C=yes ;;
        *)    echo "ERROR: the options are -a {arg}, -b, -c" >&2; exit 1 ;;
    esac
done
shift $(($OPTIND - 1))

echo "Remaining command line: $*"

?必要に応じてコマンドオプションとして追加できます。いいねメッセージを使用してください。ブロック内でcaseこれを引用するか、前にバックスラッシュを入れなければリテラルとして扱われることを覚えておいてください。

組み込みコマンドなしで別のシェルで実行したい、長い議論たとえば、ユーティリティだけを見るのでは--verboseありません。これは組み込まれていませんが、より複雑な状況で提供されるように書かれています。-vgetopt

答え2

これを行うために Bash 関連の機能を使用する必要はありません。

#!/bin/sh
while true
do
    case "$1" in
        -a)  echo Saw -a!  ;;
        -b)  echo Saw -b!  ;;
        -c)  echo Saw -c!  ;;
        -?)  cat <<USAGE
usage: $0 [-a] [-b] [-c] args

    You cannot currently combine options, as with -ac.
USAGE
            exit 1
            ;;
        *)
            echo End of options!
            break;
            ;;
    esac

    shift       # toss current $1; we're done with it now
done

for p in "$@"
do
    echo "Non-option argument: '$p'"
done

のコードとは異なります。エマ・ルーオの答え、私は移植可能なシェルスクリプトコードです。 BourneタイプのUnixシェルで実行され、1980年頃にさかのぼります。

-?私はハンドラがあなたの「メニュー」の要件を満たしていると思います。この<<USAGE構造はトレドック

関連情報