我有一个脚本使用数组将http帖子数据添加到curl请求,例如params+=(-d paramname=paramvalue)
如果我用echo
测试输出,我看到它正确扩展了数组。但是,当我将其传递给logger
时,它会在第一个之后丢失-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[@]}"
输出:-d pa=asdf -d p1=p1
但是tail /var/log/syslog
给了我Jan 15 20:00:51 fserver test[17781]: why doesn't this work -d pa=asdf p1=p1
答案 0 :(得分:2)
"${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
作为自己的参数传递,(我怀疑)logger
解释为命令选项,而不是消息字符串的一部分。然后p1=p1
被视为信息的一部分。
解决方案:使用[*]
代替[@]
:
logger -t "test" -p user.info -i "why doesn't this work ${params[*]}"
[*]
告诉shell将所有数组元素与空格(或IFS
的第一个字符)粘贴在一起,而不是将它们分成单独的单词。通常,[@]
是你想要的;这是为数不多的例外之一。