bash / shell不止一次读取LINE

时间:2013-06-20 18:49:27

标签: bash shell stdin

我有一个#!/ 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

如果我需要多次使用它,是否可以保留此输入?

感谢。

3 个答案:

答案 0 :(得分:3)

您需要自己保存输入。

#!/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

答案 1 :(得分:3)

众多解决方案之一

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

答案 2 :(得分:2)

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