我有一个使用数组向curl请求添加http post数据的脚本,例如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

最佳答案

"${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是您想要的;这是少数几个例外之一。

关于linux - Bash中的记录器和数组扩展问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48273918/

10-13 07:22