getoptから受け取ったパラメータを変更する方法は?

getoptから受け取ったパラメータを変更する方法は?

私のスクリプトには次のコマンドがあります。

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スペースやその他のメタ文字を含む引数を処理するように設計されています。これを行うには、-sbashスタイルの引用符(またはオプションに応じて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 組み込みはgetoptsno を要求し、デフォルトでevalは標準 C ライブラリ呼び出しをエミュレートします。

while getopts agvc:l:t:i: opt; do
  case "$opt" in
   i) TIME_GAP_BOOT=$OPTARG;;
   # ...
  esac
done

おすすめ記事