【问题标题】:Splitting string into array upon token根据令牌将字符串拆分为数组
【发布时间】:2010-03-27 09:45:08
【问题描述】:

我正在编写一个脚本来执行异地 rsync 备份,并且每当 rsyncline 收到一些输出时,它都会进入一个变量。然后我想在 ^M 标记上将该变量拆分为一个数组,以便我可以将它们发送到两个不同的记录器会话(因此我将它们放在日志中的单独行上)。

我当前执行 rsync 的行

result=`rsync --del -az -e "ssh -i $cert" $source $destination 2>&1`

当服务器不可用时日志中的结果

ssh: 连接到主机 offsite 端口 22: 连接超时^M rsync: 连接意外关闭 (到目前为止收到 0 个字节) [sender] rsync 错误: io 出现无法解释的错误 (代码 255) .c(601) [发件人=3.0.7]

【问题讨论】:

  • 这次我的测试窗口已关闭...异地已备份。现在我的头很痛......

标签: string bash arrays logging


【解决方案1】:
IFS=$'\n' read -a foo <<< $'12\n345\n67'
echo "${foo[@]}"

【讨论】:

  • herestring 重定向(&lt;&lt;&lt;)只在 bash 中有效,在 sh 中无效。
  • 啊,用 bash 代替 sh 来解释,效果更好……但我还是不能让它工作。
【解决方案2】:

^M 是 $'\r',所以您可以尝试将其作为分隔符:

IFS=$'\r' read -ar result <<< $(rsync --del -az -e "ssh -i $cert" $source $destination 2>&1)
echo ${result[0]}   # first part
echo ${result[1]}   # second part

【讨论】:

  • 几乎正确,^M 由我的 SSH 客户端发出,当它抛出此错误时,通过 rsync。所以它仍然以 ^M 的形式出现,但我已经让它工作了!
【解决方案3】:
IFS=$'\r'
set -- $result
echo $1
echo $2

【讨论】:

  • 我在这个记录器上得到了奇怪的中断,只得到ssh: co
  • 另外,脚本似乎在那之后挂起。
  • 使用\r 看看结果如何。
  • 关于相同的响应,相反,ut 在第一个 r 上中断...我不知道为什么,但我已经让整个脚本工作了。解决方案已发布。
  • 尝试转义反斜杠:\\n 或 \\r
【解决方案4】:

谢谢大家,通过混合您的回答,我想出了一个可行的解决方案。在这里。

result=`rsync --del -az -e "ssh -i $cert" $source $destination 2>&1`
IFS=$'\n'
for variable in $result; do
    logger $variable
done
unset IFS

现在整个脚本都可以运行了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2012-02-22
    相关资源
    最近更新 更多