如何将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%|||}"