我有一个使用数组向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/