私はいくつかのコマンドライン引数を順番に受け入れる簡単なスクリプトを書いています。
#!/bin/bash
function arg_parser () {
while [[ $# != 0 ]] ; do
case "$1" in
--one)
varone="$2"
;;
--two)
vartwo="$2"
;;
--three)
varthree="$2"
;;
--four)
varfour="$2"
;;
--five)
varfive="$2"
;;
esac
shift
done
}
arg_parser "$@"
echo $varone
echo $vartwo
echo $varthree
echo $varfour
echo $varfive
次に実行します。
./test.sh --one testone --three testthree --two testtwo --five "test five" --four "$$$$"
testone
testtwo
testthree
793793
test five
--four
「$$$$」の代わりに「793793」が返される方法を確認してください。なぜこれが起こるのか、そして/またはこれを防ぐためにスクリプトを改善する方法を知っている人はいますか?
答え1
$$
シェルのプロセスID(この場合はスクリプトが開始される前のコマンドライン)に拡張される特殊変数。同様のことを試してくださいecho $$
。バックスラッシュを使用してドル記号をエスケープするか、単一引用符で囲んで拡張を防ぐ必要がありますecho '$$$$'
。つまり、 。
$foo
二重引用符は役に立ちません。通常の変数(vs。)のように拡張値の単語の分割を防ぐだけです"$foo"
。
また、ループではshift
2番目のパラメータを一緒に使用しても一度だけ使用できます。これは、オプションの引数もオプション自体で処理されることを意味します。
$ ./test.sh --one --two --three --four --five xyz
--two
--three
--four
--five
xyz
shift
これを望まない場合は、以下を使用してから追加の時間が必要です$2
。
while [[ "$#" != 0 ]] ; do
case "$1" in
--one)
varone="$2"
shift
;;
--two)
vartwo="$2"
shift
;;
# ...
esac
shift
done