在expect命令中使用Bash数组变量扩展

时间:2016-03-08 13:50:51

标签: bash expect variable-expansion

此问题的扩展: Bash : Adding extra single quotes to strings with spaces

将命令的参数存储为bash数组

touch "some file.txt"
file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"

然后将整个命令存储在数组

finder=( find . "${args[@]}" )

在bash中,我能够运行如下命令:

"${finder[@]}"
./some file.txt

但是当我尝试使用expect时,我收到了错误

expect -c "spawn \"${finder[@]}\""
missing "
   while executing
"spawn ""
couldn't read file ".": illegal operation on a directory

为什么bash变量扩展不会发生在这里?

2 个答案:

答案 0 :(得分:5)

expect -c COMMAND要求COMMAND为单个参数。它不接受多字参数,这是"${finder[@]}"扩展到的内容。

如果你想完美地处理空白而不破坏它,那就太棘手了。 printf %q可能有用。

答案 1 :(得分:0)

双引号中的

${finder[@]}扩展为单独的单词:

$ printf "%s\n" expect -c "spawn \"${finder[@]}\""
expect
-c
spawn "a
b
c"

因此,expect没有将整个命令作为单个参数。您可以使用*

$ printf "%s\n" expect -c "spawn \"${finder[*]}\""
expect
-c
spawn "a b c"

${finder[*]}将数组元素扩展为由IFS的第一个字符分隔的单个单词,默认情况下为空格。但是,*添加的空格与原始元素中的空格之间没有区别,因此,您无法可靠地使用它。