Bash:奇妙な解析出力ですか? [コピー]

Bash:奇妙な解析出力ですか? [コピー]

私はいくつかのコマンドライン引数を順番に受け入れる簡単なスクリプトを書いています。

#!/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"

また、ループではshift2番目のパラメータを一緒に使用しても一度だけ使用できます。これは、オプションの引数もオプション自体で処理されることを意味します。

$ ./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

おすすめ記事