Bash

為什麼這個 bash 習語需要 eval?

  • May 6, 2019

為什麼會產生_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[@]}" )

您可能還想在數組聲明中使用單引號而不是雙引號:雙引號不是必需的,因為沒有元素包含變數和其他擴展。

引用自:https://unix.stackexchange.com/questions/517301