如何从标准input多variablesinput读入variables,以及如何在shell(sh,bash)中打印出一个?

我想要做的是以下几点:

  1. stdininput读取多行input到variablesA
  2. A进行各种操作
  3. 而不会丢失分隔符( \n\r\t等)到另一个命令

目前的问题是,我不能read命令,因为它停止阅读新行。

我可以用cat读stdin,就像这样:

 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附近的引号很重要。

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

命令replace$(cat file)可以被replace成等价但更快的$(< file)

 $ myVar=$(</dev/stdin) hello this is test $ echo "$myVar" hello this is test 

开球做的工作

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

是的,它也适用于我。 谢谢。

 myvar=`cat` 

是相同的

 myvar=`cat /dev/stdin` 

嗯,是。 从bash手册页:

用双引号括起来的字符保留了引号中的所有字符的字面值,除了$,`,\,并且当启用历史扩展时,! 字符$和`保留双引号内的特殊含义。

如果你关心在输出结尾保留换行符,使用这个:

 myVar=$(cat; echo x) myVar=${myVar%x} printf %s "$myVar" 

这使用了这里的技巧。

如果pipe道中没有任何东西,这个任务将无限期地挂起…

 var="$(< /dev/stdin)" 

如果您确定pipe道中是否有数据,则testing以查看pipe道是否为非空pipe道,但在此代码执行时已经存在。

 [[ -s /dev/stdin ]] && { var="$(< /dev/stdin)"; } 

但是,如果供给pipe道的过程需要一些时间才能将第一批数据inputpipe道,则需要下面的技术。 如果需要更多时间,请将read ... -t1选项更改为-t2或其他内容。 在bash版本大于4.0的系统上,也支持像-t0.5这样的小数值。 这使用read -N1来获得第一个字符。 如果read超时,它的返回码将会大于128。

还要注意,这是一个罕见的情况,我们可以安全地使用&&|| 因为我们想var=""如果没有什么read ,以及var+="$(< /dev/stdin)"

内部{...}括号在这里不是严格要求的,因为在每种情况下只有一个语句。 但是他们节省了数小时的debugging时间,所以我发现它们是一个很好的防御性编程策略。

 read -N1 -t1 var && { (( $? <= 128 )) && { var+="$(< /dev/stdin)"; } || { var=""; } }