이 스크립트가 작동하는 이유는 무엇입니까?
str=( -name "*.conf" -o -name "test test" )
find ./ \( "${str[@]}" \)
그리고 이 스크립트가 작동하지 않나요?
str[0]="-name"
str[1]="\"*.conf\""
str[2]="-o"
str[3]="-name"
str[4]="\"test test\""
find ./ \( "${str[@]}" \)
오류는 다음과 같습니다.str[1]="\"*.conf\""
나는 두 번째 시나리오에 관심이 있다.
답변1
이것:
str=( -name "*.conf" -o -name "test test" )
(보통) 다음과 같습니다.
str=( "-name" "*.conf" "-o" "-name" "test test" )
대부분의 따옴표는 필요하지 않기 때문에 생략됩니다. 파일 이름 확장을 위한 와일드카드가 없으며 기본 IFS에는 이러한 요소에 대한 필드 분할을 유발할 수 있는 공백 문자가 없습니다.
따라서 이에 상응하는 내용은 다음과 같습니다.
declare -a str
str[0]="-name"
str[1]="*.conf"
str[2]="-o"
str[3]="-name"
str[4]="test test"
또는:
declare -a str
str[0]=-name
str[1]=*.conf # no filename expansion in variable assignment
str[2]=-o
str[3]=-name
str[4]="test test"