如何让Bash从管道输入或命令行参数中读取?

9
我希望读取一些数据,可以从管道或命令行参数(比如 $1)中获取其中一个,如果两者都有,优先使用管道。这段代码告诉我管道是否已打开,但我不知道应该输入什么内容来避免阻塞脚本(test.sh),可以使用 read 或 cat 命令。
if [ -t 0 ]
then
    echo nopipe
    DATA=$1
else
    echo pipe
    # what here?
    # read from pipe into $DATA
fi

echo $DATA

执行上述 test.sh 脚本,应该得到以下输出结果:
$ echo 1234 | test.sh
1234
$ test.sh 123
123
$ echo 1234 | test.sh 123
1234
1个回答

18

您可以使用以下方式将stdin的所有输入读取到变量中:

data=$(cat)

请注意,您所描述的是非规范行为。好的Unix用户应该:
  1. 如果提供了文件名作为参数,则从文件名中读取(无论stdin是否为tty)
  2. 如果没有提供文件,则从stdin中读取
这就是您在sed、grep、cat、awk、wc和nl等工具中看到的情况。
无论如何,以下是您请求的功能演示的示例:
$ cat script 
#!/bin/bash

if [ -t 0 ]
then
    echo nopipe
    data=$1
else
    echo pipe
    data=$(cat)
fi

echo "$data"

$ ./script 1234
nopipe
1234

$ echo 1234 | ./script
pipe
1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接