このbashイディオムにevalが必要なのはなぜですか?

このbashイディオムにevalが必要なのはなぜですか?

なぜこれが起こるのです_results=""か?

_results="$( grep ${_gopts[@]} )"

これにより、目的の結果が生成されます(fstabのSSHFSエントリのリスト)。

_results="$( eval grep ${_gopts[@]} )"

_gopts 配列はどちらの場合も同じで、以下を含みます。

declare -p _gopts
declare -a _gopts=([0]="--extended-regexp" [1]="--with-filename" [2]="--recursive" [3]="--include" [4]="fstab" [5]="'^[^#]*sshfs#'" [6]="/etc")

答え1

これは、5番目の要素(regex:)の周りに追加の引用符があるためです[5]="'^[^#]*sshfs#'"

'^regex'grepコマンドは、代わりに一致しない型の引数を渡します(両方とも後に単一引用符が続く^regex方法はありません)。regexそしてまた、行の先頭から始めます。)

これを削除してから、配列拡張を引用してください("${_gopts[@]}"代わりに${_gopts[@]})。

declare -p _gopts
declare -a _gopts=([0]="--extended-regexp" [1]="--with-filename" [2]="--recursive" [3]="--include" [4]="fstab" [5]="^[^#]*sshfs#" [6]="/etc")

_results=$( grep "${_gopts[@]}" )

配列宣言に二重引用符の代わりに一重引用符を使用することもできます。要素には変数やその他の拡張機能は含まれていないため、二重引用符は必要ありません。

関連情報