如何将stdin中的mutliline输入读取到变量中,以及如何在shell(sh、bash)中输出一个变量?

如何将stdin中的mutliline输入读取到变量中,以及如何在shell(sh、bash)中输出一个变量?,bash,shell,stdin,multiline,Bash,Shell,Stdin,Multiline,我想做的是: 将多行输入从stdin读入变量A 对A 在不丢失分隔符(\n、\r、\t等)的情况下,将A输送到另一个命令 当前的问题是,我不能用read命令读入它,因为它在换行时停止读取 我可以用cat阅读标准文本,如下所示: my_var=`cat /dev/stdin` #!/usr/local/bin/bash A=`cat /dev/stdin` if [ ${#A} -eq 0 ]; then exit 0 else cat ${A} | /usr

我想做的是:

  • 将多行输入从
    stdin
    读入变量
    A
  • A
  • 在不丢失分隔符(
    \n
    \r
    \t
    等)的情况下,将
    A
    输送到另一个命令
  • 当前的问题是,我不能用
    read
    命令读入它,因为它在换行时停止读取

    我可以用
    cat
    阅读标准文本,如下所示:

    my_var=`cat /dev/stdin`
    
    #!/usr/local/bin/bash
    
    A=`cat /dev/stdin`
    
    if [ ${#A} -eq 0 ]; then
            exit 0
    else
            cat ${A} | /usr/local/sbin/nextcommand
    fi
    
    ,但我不知道怎么打印。因此,换行符、制表符和其他分隔符仍然存在

    我的示例脚本如下所示:

    my_var=`cat /dev/stdin`
    
    #!/usr/local/bin/bash
    
    A=`cat /dev/stdin`
    
    if [ ${#A} -eq 0 ]; then
            exit 0
    else
            cat ${A} | /usr/local/sbin/nextcommand
    fi
    

    这对我有用:

    myvar=`cat`
    
    echo "$myvar"
    

    $myvar
    周围的引号很重要。

    是的,它对我也有用。谢谢

    myvar=`cat`
    

    myvar=`cat /dev/stdin`
    
    嗯,是的。从
    bash
    手册页:

    用双引号括起字符 保留所有的文本值 引号中的字符, 除了$、`、\、和之外,当历史扩展为 启用!。字符$和` 在双引号中保留其特殊含义


    在Bash中,有另一种方法
    man bash
    提到:

    命令替换
    $(cat文件)
    可以替换为等效但更快的
    $(


    $myVar=$(tee执行此任务

    #!/bin/bash
    myVar=$(tee)
    

    如果您确实关心在输出末尾保留尾随换行符,请使用以下方法:

    myVar=$(cat; echo x)
    myVar=${myVar%x}
    printf %s "$myVar"
    
    这使用了来自的技巧。

    [更新] 如果管道中没有任何东西,此任务将无限期挂起

    var="$(< /dev/stdin)"
    
    此技术避免使用
    var=“$(command…)”
    命令替换,根据设计,该替换将始终去除任何后续换行符

    如果首选命令替换,为了保留尾随的换行符,我们可以在
    $()
    内部的输出中附加一个或多个分隔符,然后在外部去掉它们

    例如(注意第一个命令中的
    $(parens)
    ,第二个命令中的
    ${brages}


    应该读myvar=$(cat);echo“${myvar}”--但在其他情况下,我的解决方案正好是.gnud,您建议的那些额外的引号字符实际上不会改变功能。@appenwarr:引号是至关重要的,否则您依赖于默认值的IFS,这是一种非常糟糕的做法。失败。
    echo“$myvar”
    如果文件以前没有换行符,则在文件中添加换行符。@CommaToast,这是回显的函数,而不是引号。使用
    -n
    标志(或您平台上的等效标志)。echo只是一个用法示例。+1因为tee很优雅,可以读入。哇,谢谢!但是你没有回答这个问题,如何使用更改换行符来打印。-1因为
    echo“$myVar”
    将在没有换行符的情况下添加换行符。@CommaToast:和
    $(…)
    将删除任何尾随的换行符,使它们完美地结合在一起,不是吗?您可以轻松切换到
    printf
    以避免这种情况。不,它们不完美地结合在一起。无论在这个解决方案中是什么,无论是否有一个尾随的换行符。如果您任意切换到printf,现在哟你永远不会有尾随的换行符,即使有。公平地说,unix设计于1946年,就其而言,基本上是一台美化的打字机,这不是你的错。我只能看到unix的大脑中来回回荡着回车符。只是不能要求它像对待其他字符一样对待换行符。不,这是错误的st必须回到它的打字机爬虫大脑。但无论如何,我能找到的唯一解决办法是
    var=`cat;echo x`
    ,然后在准备输出它时,输出
    ${var%x}
    ,以便换行符(或缺少换行符)是保留的。很难看,但是,它可以工作…@Nikhil Ctrl-C中止整个脚本;很难将其转发到子命令。要跳过N行之后的输入,我将使用
    head
    myVar=$(head-N 10/dev/stdin)
    如果这不适合您,您可能需要实现一个
    read
    -loop yourself.Nice。最后两行可以替换为
    echo-n“${myVar%x}”
    ,但我想首先修复变量更模块化。
    _stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
    _stdin="${_stdin%|||}"