Bash 期望命令中的数组变量扩展
Bash array variable expansion inside expect command
这个问题的扩展:
将命令的参数存储为 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 变量扩展没有发生在这里?
${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
的第一个字符分隔,默认为 space。但是,*
添加的space与原始元素中的白色space没有区别,因此,您不能可靠地使用它。
expect -c COMMAND
要求 COMMAND 是单个参数。它不接受多词参数,这是 "${finder[@]}"
扩展到的内容。
如果你想完美地处理空白而不进行破坏,那将很棘手。 printf %q
可能有用。
这个问题的扩展:
将命令的参数存储为 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 变量扩展没有发生在这里?
${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
的第一个字符分隔,默认为 space。但是,*
添加的space与原始元素中的白色space没有区别,因此,您不能可靠地使用它。
expect -c COMMAND
要求 COMMAND 是单个参数。它不接受多词参数,这是 "${finder[@]}"
扩展到的内容。
如果你想完美地处理空白而不进行破坏,那将很棘手。 printf %q
可能有用。