使用数组与字符串查找命令

使用数组与字符串查找命令

为什么这个脚本有效?

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"

相关内容