Linux bash中的记录器和阵列扩展问题

Linux bash中的记录器和阵列扩展问题,linux,bash,Linux,Bash,我有一个脚本,它使用数组向curl请求添加http post数据,例如params+=(-d paramname=paramvalue) 如果我用echo测试输出,我会看到它正确地扩展了数组。但是,当我将其传递给记录器时,它会在第一个之后丢失-d。我做错了什么 #!/bin/bash params=(-d pa=asdf) params+=(-d p1=p1) echo "${params[@]}" logger -t "test" -p user.info -i "why doesn't t

我有一个脚本,它使用数组向curl请求添加http post数据,例如
params+=(-d paramname=paramvalue)

如果我用echo测试输出,我会看到它正确地扩展了数组。但是,当我将其传递给
记录器
时,它会在第一个之后丢失
-d
。我做错了什么

#!/bin/bash
params=(-d pa=asdf)
params+=(-d p1=p1)
echo "${params[@]}"
logger -t "test"  -p user.info -i "why doesn't this work ${params[@]}"
输出:
-dpa=asdf-dp1=p1

但是
tail/var/log/syslog
给了我
Jan 15 20:00:51服务器测试[17781]:为什么不起作用-d pa=asdf p1=p1

“${params[@]}”
扩展到数组的内容,每个元素都作为单独的单词(参数)处理。因此,
echo“${params[@]}”
相当于
echo“-d”pa=asdf“-d”p1=p1”。
echo`将其参数与中间的空格粘在一起,因此这看起来很好。但是当你跑的时候

logger -t "test"  -p user.info -i "why doesn't this work ${params[@]}"
相当于

logger -t "test"  -p user.info -i "why doesn't this work -d" "pa=asdf" "-d" "p1=p1"
因此,只有第一个
-d
作为消息字符串的一部分传递。
pa=asdf
参数被追加到消息中(正如
echo
所做的那样)。第二个
-d
作为自己的参数传递,我怀疑
记录器将其解释为命令选项,而不是消息字符串的一部分。然后,
p1=p1
被视为消息的一部分

解决方案:使用
[*]
而不是
[@]

logger -t "test"  -p user.info -i "why doesn't this work ${params[*]}"

[*]
告诉shell将所有数组元素粘贴在一起,并在它们之间加空格(或
IFS
的第一个字符),而不是将它们拆分成单独的单词。通常,
[@]
是你想要的;这是少数例外情况之一。

谢谢!“IFS”
IFS
是一个特殊的shell变量,用于定义shell如何拆分和合并“单词”。基本上,它是shell视为空白的字符列表。默认值为空格+制表符+换行符。有关更多信息,请参阅。