gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:15 25 4
gpt4 key购买 nike

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

最佳答案

"${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 的第一个字符)粘贴在一起,而不是拆分它们成单独的词。通常,[@] 就是您想要的;这是少数异常(exception)之一。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com