이 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

다섯 번째 요소(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[@]}" )

배열 선언에 큰따옴표 대신 작은따옴표를 사용할 수도 있습니다. 요소에는 변수 및 기타 확장이 포함되어 있지 않으므로 큰따옴표가 필요하지 않습니다.

관련 정보