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

Gab*_*vay 7 bash pipe

我想从管道或命令行参数(比如说$1)中读取一些数据,无论哪个提供(优先级都有管道).

这个片段告诉我管道是否打开但是我不知道要放入什么内容以便不阻止脚本(test.sh)(使用readcat)

if [ -t 0 ]
then
    echo nopipe
    DATA=$1
else
    echo pipe
    # what here?
    # read from pipe into $DATA
fi

echo $DATA
Run Code Online (Sandbox Code Playgroud)

执行test.sh上面的脚本我应该得到以下输出:

$ echo 1234 | test.sh
1234
$ test.sh 123
123
$ echo 1234 | test.sh 123
1234
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 12

您可以将所有stdin读入变量:

data=$(cat)
Run Code Online (Sandbox Code Playgroud)

请注意,您所描述的是非规范行为.好的Unix公民会:

  1. 如果作为参数提供,则从文件名读取(无论stdin是否为tty)
  2. 如果没有提供文件,则从stdin读取

你看这是什么sed,grep,cat,awk,wcnl仅举几例.


无论如何,这是您展示所请求功能的示例:

$ 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
Run Code Online (Sandbox Code Playgroud)