bash中记录器和数组扩展的问题

时间:2018-01-16 04:03:35

标签: linux bash

我有一个脚本使用数组将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

1 个答案:

答案 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的第一个字符)粘贴在一起,而不是将它们分成单独的单词。通常,[@]是你想要的;这是为数不多的例外之一。