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

时间:2015-04-07 21:42:30

标签: bash pipe

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

此片段告诉我管道是否打开但是我不知道要放入什么内容以便不阻止脚本(test.sh)(使用read或{{ 1}})

cat

执行上面的if [ -t 0 ] then echo nopipe DATA=$1 else echo pipe # what here? # read from pipe into $DATA fi echo $DATA 脚本,我应该得到以下输出:

test.sh

1 个答案:

答案 0 :(得分:11)

您可以使用以下命令将所有stdin读入变量:

data=$(cat)

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

  1. 如果作为参数提供,则从文件名中读取(无论stdin是否为tty)
  2. 如果没有提供文件,则从标准输入读取
  3. 这是您在sedgrepcatawkwcnl中看到的内容,仅举几例。


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

    $ 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