Bash
為什麼這個 bash 習語需要 eval?
為什麼會產生
_results=""
…_results="$( grep ${_gopts[@]} )"
這會產生所需的 _results(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")
由於第 5 個元素(正則表達式:)周圍有額外的引號
[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[@]}" )
您可能還想在數組聲明中使用單引號而不是雙引號:雙引號不是必需的,因為沒有元素包含變數和其他擴展。