Linux bash中的记录器和阵列扩展问题
我有一个脚本,它使用数组向curl请求添加http post数据,例如Linux bash中的记录器和阵列扩展问题,linux,bash,Linux,Bash,我有一个脚本,它使用数组向curl请求添加http post数据,例如params+=(-d paramname=paramvalue) 如果我用echo测试输出,我会看到它正确地扩展了数组。但是,当我将其传递给记录器时,它会在第一个之后丢失-d。我做错了什么 #!/bin/bash params=(-d pa=asdf) params+=(-d p1=p1) echo "${params[@]}" logger -t "test" -p user.info -i "why doesn't t
params+=(-d paramname=paramvalue)
如果我用echo测试输出,我会看到它正确地扩展了数组。但是,当我将其传递给记录器
时,它会在第一个之后丢失-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[@]}"
输出:-dpa=asdf-dp1=p1
但是tail/var/log/syslog
给了我Jan 15 20:00:51服务器测试[17781]:为什么不起作用-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
作为自己的参数传递,我怀疑记录器将其解释为命令选项,而不是消息字符串的一部分。然后,p1=p1
被视为消息的一部分
解决方案:使用[*]
而不是[@]
:
logger -t "test" -p user.info -i "why doesn't this work ${params[*]}"
[*]
告诉shell将所有数组元素粘贴在一起,并在它们之间加空格(或IFS
的第一个字符),而不是将它们拆分成单独的单词。通常,[@]
是你想要的;这是少数例外情况之一。谢谢!“IFS”IFS
是一个特殊的shell变量,用于定义shell如何拆分和合并“单词”。基本上,它是shell视为空白的字符列表。默认值为空格+制表符+换行符。有关更多信息,请参阅。