下面的Perl脚本(my.pl)既可以从命令行参数中的文件读取,也可以从标准输入(STDIN)读取:
while (<>) {
print($_);
}
Perl my.pl将从标准输入中读取,而Perl my.pl .txt将从a.txt中读取。这很方便。
Bash中也有类似的功能吗?
下面的Perl脚本(my.pl)既可以从命令行参数中的文件读取,也可以从标准输入(STDIN)读取:
while (<>) {
print($_);
}
Perl my.pl将从标准输入中读取,而Perl my.pl .txt将从a.txt中读取。这很方便。
Bash中也有类似的功能吗?
当前回答
请尝试以下代码:
while IFS= read -r line; do
echo "$line"
done < file
其他回答
以下是使用标准sh(在Debian上用Dash测试)的工作,相当可读,但这是一个品味问题:
if [ -n "$1" ]; then
cat "$1"
else
cat
fi | commands_and_transformations
详细信息:如果第一个参数非空,则cat该文件,否则cat标准输入。然后整个if语句的输出由command_and_transforms处理。
也许最简单的解决方案是使用合并重定向操作符重定向标准输入:
#!/bin/bash
less <&0
标准输入是文件描述符0。上面的代码将通过管道传输到bash脚本的输入发送到less的标准输入中。
阅读有关文件描述符重定向的更多信息。
作为一种变通方法,你可以使用/dev目录下的stdin设备:
....| for item in `cat /dev/stdin` ; do echo $item ;done
每当IFS中断输入流时,回显解决方案就添加新行。@fgm的回答可以稍微修改一下:
cat "${1:-/dev/stdin}" > "${2:-/dev/stdout}"
代码${1:-/dev/stdin}只理解第一个参数,所以你可以这样使用:
ARGS='$*'
if [ -z "$*" ]; then
ARGS='-'
fi
eval "cat -- $ARGS" | while read line
do
echo "$line"
done