【问题标题】:Bash variable concatenation fails inside loopBash变量连接在循环内失败
【发布时间】:2013-02-13 16:54:09
【问题描述】:

鉴于以下陈述:

ac_reg_ids="-1" #Starting value
(mysql) | while read ac_reg_id; do
    echo "$ac_reg_id" #variable is a result of a mysql query. Echoes a number.
    ac_reg_ids="$ac_reg_ids, $ac_reg_id" #concatenate a comma and $ac_reg_id, fails.
done
echo "ac_reg_ids: $ac_reg_ids" #echoes -1

现在根据这个答案:https://stackoverflow.com/a/4181721/1313143

串联应该有效。但是,为什么不呢?循环内有什么不同?

以防万一:

> bash -版本
> GNU bash,版本 4.2.8(1)-release (i686-pc-linux-gnu)

更新

使用 set -eux 输出:

+ echo 142
142
+ ac_reg_ids='-1, 142'
+ read ac_reg_id

【问题讨论】:

  • 对我来说看起来不错。那是失败的确切代码,复制和粘贴,不是手动输入,没有添加或删除吗?
  • @JohnKugelman 是的,我复制了它。
  • 您使用的是哪个版本的 bash?我刚刚使用 4.2.24 进行了尝试,您的示例代码的输出正是您所期望的,如果未设置 ac_reg_id 变量,最后一行将打印 -1,
  • 请在这段代码之前运行set -eux,再次运行并在此处粘贴输出。
  • @Alex 我添加了版本。它比你的要老一点,但我不明白为什么会有这么小的差异。

标签: string bash variables concatenation


【解决方案1】:

就像shellcheck 会很有帮助地指出,您正在子shell 中修改ac_reg_ids。

重写它以避免子shell:

ac_reg_ids="-1" #Starting value
while read ac_reg_id; do
    echo "$ac_reg_id" 
    ac_reg_ids="$ac_reg_ids, $ac_reg_id"
done < <( mysql whatever )  # Redirect from process substution, avoiding pipeline
echo "ac_reg_ids: $ac_reg_ids" 

【讨论】:

  • 我会看看它是否有效。感谢您指出该网站,还不知道。您能否提供有关“
  • 没有&lt; &lt;&lt; 是从文件重定向的,我相信你已经知道了,&lt;(cmd) 扩展为文件名,读取时会产生来自cmd 的输出。对此的任何变体,例如&lt;&lt; (cmd)&lt;&lt;(cmd)&lt; &lt; cmd 都是无效的。
  • 好的,我现在知道了。谢谢。
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 2020-04-21
  • 2018-08-02
  • 2017-02-24
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多