【问题标题】:while read line stops after first iteration [duplicate]而第一次迭代后读取行停止[重复]
【发布时间】:2014-03-17 14:10:57
【问题描述】:

我正在尝试执行一个简单的脚本,以使用svmatch 从文件输入的服务器名称上捕获多个服务器的详细信息。

#!/bin/sh
while read line; do
svmatch $line
done < ~/svr_input;

svmatch 命令作为备用命令执行时没有问题。

【问题讨论】:

  • 您是否有意对从文件中读取的行进行字符串拆分和全局扩展,修剪尾随空格并扩展反斜杠转义序列?如果您不想做所有这些事情,则需要进行一些额外的更改。
  • 更明确地说:如果您不想对行进行字符串拆分和全局扩展,请将其设为svmatch "$line"。如果您不想在输入中扩展反斜杠转义序列,请将其设为read -r。如果您不想从输入中去除尾随空格,请将其设为while IFS= read

标签: bash unix loops iteration


【解决方案1】:

/dev/null重定向你​​的内部命令的标准输入:

svmatch $line </dev/null

否则,svmatch 可以使用标准输入(当然,这是剩余行的列表)。

另一种方法是使用不同于标准输入默认值的文件描述符:

#!/bin/sh
while IFS= read -r line <&3; do
  svmatch "$line"
done 3<svr_input

...如果使用 bash 而不是 /bin/sh,您还有其他一些选择;例如,bash 4.1 或更高版本可以分配一个空闲的文件描述符,而不需要硬编码一个特定的 FD 号:

#!/bin/bash
while IFS= read -r -u "$fd_num" line; do
  do-something-with "$line"
done {fd_num}<svr_input

【讨论】:

  • 优秀的解释和解决方案。我在消耗标准输入的循环内的命令有类似的问题。您的 fd_num 选项解决了我的问题(并教会了我如何处理未来的类似问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2015-08-07
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多