【问题标题】:bash/shell read LINE more than oncebash/shell 多次读取 LINE
【发布时间】:2013-06-20 18:49:26
【问题描述】:

我有一个 #!/bin/sh 脚本,我需要多次读取管道输入。

我迭代它的方式似乎丢弃了它,例如以下;

while read LINE; do
  echo "-- $LINE"
done

while read LINE; do
  echo "## $LINE"
done

当用

调用时
find ~/Desktop | ./my.sh

生产

-- /Users/me/Desktop/some.txt
-- /Users/me/Desktop/other.txt

而不是

-- /Users/me/Desktop/some.txt
-- /Users/me/Desktop/other.txt
## /Users/me/Desktop/some.txt
## /Users/me/Desktop/other.txt

如果我需要多次使用此输入,是否有办法保留它?

谢谢。

【问题讨论】:

  • 更长的答案:是的。见下文。

标签: bash shell stdin


【解决方案1】:

您需要自己保存输入。

#!/bin/sh

i=0;
while read LINE; do
  LINES[$i]="${LINE}"
  i=$((i+1))
done

for ENTRY in "${LINES[@]}"; do
  echo "-- ${ENTRY}"
done


for ENTRY in "${LINES[@]}"; do
  echo "## ${ENTRY}"
done

样本输出:

ls /bin/b*|./test.sh
-- /bin/basename
-- /bin/bash
## /bin/basename
## /bin/bash

【讨论】:

  • 至少LINES[$i]="$LINE" ?
【解决方案2】:

众多解决方案之一

TMP="/tmp/myfile.$$"
trap "rm -f '$TMP';exit" 0 2 15

while read LINE; do
  echo "-- $LINE"
done < <(tee $TMP)

exec < $TMP
while read LINE; do
  echo "## $LINE"
done

另一个

TMP="/tmp/myfile.$$"
trap "rm -f '$TMP';exit" 0 2 15

cat - > $TMP

while read LINE; do
  echo "-- $LINE"
done < $TMP

while read LINE; do
  echo "## $LINE"
done < $TMP

【讨论】:

  • +1 不过,我只是将输入重定向到 while 循环,而不是重定向整个 shell 的输入:while read LINE; do ...; done &lt; $TMP
  • @chepner 又添加了一个例子,thanx。 ;)
【解决方案3】:

cat 临时文件 (mktemp) 的输入。然后根据需要多次读取文件。

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2015-07-02
    • 2011-01-23
    • 1970-01-01
    • 2013-04-26
    • 2018-12-15
    • 2017-05-30
    • 2020-05-24
    相关资源
    最近更新 更多