【问题标题】:Looping in bash [duplicate]在bash中循环[重复]
【发布时间】:2015-09-11 08:31:52
【问题描述】:

我在 bash 中有一个 do-while 循环,它只运行一次主体,但不再运行。

while read id; do
    bash ./setup_instance.sh "${id}" 
    echo "Ran setup_instance"
done < ids.txt
echo "Finished of loop"

文件ids.txt 有两行,每行一个“ID”字符串。我通过用 echo "ID: ${id}" 替换循环内的行来测试这一点,并且循环工作。

另外,请注意,代码确实到达了两个回显行,因此调用脚本不会让我们退出执行。

我做错了什么?

【问题讨论】:

  • setup_instance.sh 是否真的完成了,或者它是否一直在无限循环中运行? (显示的代码对我来说看起来不错,如果 setup_instance.sh 充满了一些虚拟代码,对我来说可以正常工作,这就是为什么我怀疑 setup_instance.sh 是罪魁祸首。)
  • 如果你让 echo 工作了两次,那么 body 会运行两次。 setup_instance.sh 是做什么的?您期望得到的行为是什么?
  • setup_instance 是否可能正在消耗所有输入,因此第二次调用 read 时没有任何内容可供读取? (例如,如果它在没有-n 的情况下调用ssh。)尝试从/dev/null 重定向其标准输入。
  • @DevSolar 是的,setup_instance.sh 完成,如前所述,echo 语句显示发生了什么。
  • @WimLewis,是的,ssh 没有 -n。如何从dev/null 重定向stdin?像这样:&lt;/dev/null ?这会破坏脚本中的所有管道操作吗?

标签: linux bash shell unix


【解决方案1】:

运行时

while read id; do
    echo "Ran setup_instance ${id}"
done < ids.txt
echo "Finished of loop"

带有 ids.txt:

abc
bcd

我得到了预期的输出(两行)。

您的最后一行可能不包含换行符 (\n)

你可以通过运行cat -A ids.txt来检查

应该回显

abc$
bcd$

如果缺少第二个美元,请尝试运行 dos2unix ids.txt 以添加缺少的换行符(或手动添加)

【讨论】:

  • 是的,这个回声循环对我来说很好用。是调用失败的脚本
猜你喜欢
  • 2015-04-27
  • 2019-04-09
  • 1970-01-01
  • 2019-02-17
  • 2016-08-06
相关资源
最近更新 更多