为什么这个脚本有效?
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"