
数日間検索しましたが、まだ答えが見つかりませんでした。あなたが私に正しい方向を教えてくれることを願っています。
1行で呼び出すオプションを含むbashスクリプトを書く方法を知りたいです。例: script.sh -a -b -c
。選択していないパラメータは無視されます。
メニュー/オプションは次のとおりです。
-a description: something
-b description: something else
-c description: something different
-d description: something..
これを行う方法はありますか?
答え1
スイッチとパラメータを処理する一般的な方法は、getopts
関数を使用することです。これは組み込み関数であり、bash
bashのマニュアルページ()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
ありません。これは組み込まれていませんが、より複雑な状況で提供されるように書かれています。-v
getopt
答え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
構造はトレドック。