编写bash脚本时遇到问题。我被要求编写一个可以通过两种方式调用的脚本,读取文件或读取标准输入。但是,当我使用while-read时,我无法再读取标准输入。这是我的代码:
#!/bin/bash
FILE=$1
while read LINE;
do
echo "$LINE" | tr " " "\n" | tr "\t" "\n"
done < $FILE
答案 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)
-
来表示输入来自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