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

问题描述 投票:1回答:1

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

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

© www.soinside.com 2019 - 2024. All rights reserved.