如何从标准input多variablesinput读入variables,以及如何在shell(sh,bash)中打印出一个?
我想要做的是以下几点:
- 从
stdin
input读取多行input到variablesA
- 对
A
进行各种操作 - 而不会丢失分隔符(
\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=""; } }