为什么这个 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]="'^[^#]*sshfs#'"

grep 命令将传递一个形式的参数'^regex'而不是^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[@]}" )

您可能还想在数组声明中使用单引号而不是双引号:双引号不是必需的,因为没有元素包含变量和其他扩展。

相关内容