評価セット( "$params")の代わりにbash配列を使用できますか?

評価セット(

見ています。optparseライブラリオプションの解析では、bash特に生成されたコードの次の点を参照してください。

params=""
while [ $# -ne 0 ]; do
  param="$1"
  shift

  case "$param" in

    --my-long-flag)
      params="$params -m";;
    --another-flag)
      params="$params -a";;
    "-?"|--help)
      usage
      exit 0;;
    *)
      if [[ "$param" == --* ]]; then
        echo -e "Unrecognized long option: $param"
        usage
        exit 1
      fi
      params="$params \"$param\"";;  ##### THIS LINE
  esac
done

eval set -- "$params"  ##### AND THIS LINE

# then a typical while getopts loop

ここで使用する本当の理由はありますかeval?入力eval 〜らしい適切な消毒を行います。しかし、次のものを使用することも同様に効果的ではないでしょうか?

params=()
# ...
    --my-long-flag)
      params+=("-m");;
    --another-flag)
      params+=("-a");;
# ...
      params+=("$param");;
# ...
set -- "${params[@]}"

私にとっては、これはよりきれいに見えます。

実際には、配列から直接(または?paramsを使用せずに)代わりにを使用してオプションを解析できますか?setwhile getopts "ma" option "${params[@]}"; dowhile getopts "ma" option; do

ベストアンサー1

問題は「しなければならない評価セットの代わりにbash配列を使用する - "$params"? 「正解ははい!

スクリプト内のevalへの入力は明らかに次のようになります。いいえ正しく消毒してください。努力する

    yourscript '`xterm`'

バックティックが一重引用符で正しく囲まれていても、xtermが起動することがわかります。 (比較

    echo '`xterm`'

xtermは起動しません。 )

バグを保存しながら修正することはeval非常に困難です。行を変えても

    params="$params \"$param\"";;

到着

    params="$params '$param'";;

役に立たない: 今

    yourscript '`xterm`'

xtermはもう起動しませんが、

    yourscript \'' `xterm` '\'

まだ。

おすすめ記事