次のようにtestShell.sh
使用されるシェルスクリプトがあります。getopts
#!/bin/bash
while getopts ":j:e:" option; do
case "$option" in
j) MYHOSTNAME=$OPTARG ;;
e) SCRIPT_PATH=$OPTARG ;;
*) ;;
esac
done
echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"
私のテストが次のように実行されたとき:
$ testShell.sh -jvalue1 -evalue4 -Djvalue3 -pvalue2
私が得た結果は次のとおりです。
j=value3
e=2
remaining=
しかし、私は出力が次のようになりたいと思います。
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
保証は可能ですか? getopts
最初のキャラクターの投稿のみを見る -
シンボル?-Djvalue3
これは-jvalue3
and-pvalue2
として解釈されません-e2
。
答え1
この試み:
$ ./testShell.sh -j value1 -e value4 -D jvalue3 -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
オプションとオプション文字列の間のスペースに注意してください。
help getopts
説明する:
OPTSTRING contains the option letters to be recognized; if a letter
is followed by a colon, the option is expected to have an argument,
which should be separated from it by white space.
つまり、オプションとオプション文字列の間にスペースが必要です。
bash に組み込まれた getopt が実行できる機能以上の機能が必要な場合、/usr/bin/getopt ユーティリティーは、オプションとオプション文字列の間にスペースがある場合とない場合の長いオプションと短いオプションの両方をサポートします。オプションの文字列パラメータなどの追加機能もサポートされています。
ちなみに、 /usr/bin/getopt は、debianやubuntuなどの派生製品のutil-linuxパッケージで利用できます。他のディストリビューションや*nixesについてはわかりませんが、ソースが見つからない場合はダウンロードできます。 Debian アーカイブの他の場所で検索してください。
答え2
これを3つのフォーラムに投稿し、どこでも検索した後...ついに次のことを試してみました...
testShell.sh -jvalue1 -evalue4 -- -Djvalue3 -pvalue2
気づく
--
後ろに-evalue4
出力は次のとおりです
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
私は信じる、--
尋ねgetopts
、信じる処理停止オプション。