見ています。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
を使用せずに)代わりにを使用してオプションを解析できますか?set
while getopts "ma" option "${params[@]}"; do
while 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` '\'
まだ。