读取文件或读取标准用户输入

时间:2017-04-14 08:12:55

标签: bash

编写bash脚本时遇到问题。我被要求编写一个可以通过两种方式调用的脚本,读取文件或读取标准输入。但是,当我使用while-read时,我无法再读取标准输入。这是我的代码:

#!/bin/bash
FILE=$1
while read LINE; 
do
    echo "$LINE" | tr " " "\n" | tr "\t" "\n"
done < $FILE

2 个答案:

答案 0 :(得分:3)

问题来自于您总是将$ FILE作为读取的输入。 如果有参数,可以尝试将文件重定向到通道0,否则将其留给stdin。

#!/bin/bash
FILE=$1
if [ ! -z "$FILE" ]
then
  exec 0< "$FILE"
fi
while read LINE
do
    echo "$LINE" | tr " " "\n" | tr "\t" "\n"
done

exec 0< "$FILE"告诉shell使用$ FILE作为通道0的输入。提醒:默认情况下read侦听通道0。

0<是此处的关键,其中0表示通道0,<表示这是输入。如果没有参数,exec 0< "$FILE"被调用,在这种情况下,通道0将使用标准输入。

答案 1 :(得分:2)

按照惯例,UNIX工具使用特殊文件名-来表示输入来自stdin。你可以适应:

file="${1}"
if [ "${file}" = "-" ] ; then
    file=/dev/stdin # special device for stdin
fi

while read -r line ; do
    do something
done < "${file}"

您现在可以像这样调用工具

tool -             # reads from terminal
cmd | tool -       # used in a pipe
tool /path/to/file # reads from file