私のスクリプトには次のコマンドがあります。
set -- `getopt -q agvc:l:t:i: "$@"`
...
while [ -n "$1" ]
do
-i) TIME_GAP_BOOT=$2
shift ;;
...
sleep $TIME_GAP_BOOT
呼び出しスクリプトを使用すると-i 2
エラーが発生します。
sleep: invalid time interval `\'2\''
私は何が間違っていましたか?パラメータ型を正しく指定する方法は?
答え1
組み込みのbashをgetopts
使用する方が簡単です。を使用している場合は、bash
代わりにこれを使用する必要がありますgetopt
。
GNUは、getopt
スペースやその他のメタ文字を含む引数を処理するように設計されています。これを行うには、-s
bashスタイルの引用符(またはオプションに応じてcshスタイルの引用符)を含む結果文字列を生成します。eval
引用符を解釈するにはgetopts
。
次の例は、getoptディストリビューションからのものです。私はそれとは何の関係もありません。 (コンピュータのどこかに表示する必要があります。UbuntuとDebianの場合として表示されます/usr/share/doc/util-linux/examples/getopt-parse.bash
。数行だけ引用します。
# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
eval
しばしば、眉をひっくり返す例のコメントで指摘された引用を超えて見ることが重要です。
対照的に、bash 組み込みはgetopts
no を要求し、デフォルトでeval
は標準 C ライブラリ呼び出しをエミュレートします。
while getopts agvc:l:t:i: opt; do
case "$opt" in
i) TIME_GAP_BOOT=$OPTARG;;
# ...
esac
done