我想做的是以下内容:
从多行输入读stdin
入变量A
进行各种操作 A
管A
,而不会失去定界符符号(\n
,\r
,\t
等)到另一个命令
目前的问题是,我无法用read
命令读取它,因为它停止在换行时读取.
我可以读取stdin 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
Tanktalus.. 64
这对我有用:
myvar=`cat` echo "$myvar"
引号$myvar
很重要.
这对我有用:
myvar=`cat` echo "$myvar"
引号$myvar
很重要.
在Bash中,还有另一种方式; man bash
提到:
命令替换
$(cat file)
可以替换为等效但更快$(< file)
.
$ myVar=$(
公平地说,unix是在1946年设计的并不是你的错,而且基本上它是一个美化的打字机,就其而言.我可以看到回车在unix的大脑里来回走动.它不能被要求像其他角色一样对待新行.不,它只是*有*恢复其打字机爬行动物的大脑.但无论如何,我能找到的唯一解决方法是`var = \`cat; echo x \``然后在准备输出它时,输出`$ {var%x}`以保留换行符(或缺少换行符).丑陋但是,它有效......
3> Sergey Grigo..:tee完成这项工作
#!/bin/bash myVar=$(tee)
4> 小智..:是的它也适合我.谢谢.
myvar=`cat`是相同的
myvar=`cat /dev/stdin`嗯,是.从
bash
手册页:用双引号括起字符会保留引号内所有字符的字面值,但$,`,\除外,并且,当启用历史记录扩展时,!字符$和`在双引号中保留其特殊含义.
5> DocSalvager..:[更新]
如果管道中没有任何东西,此作业将无限期挂起。
var="$(< /dev/stdin)"我们可以通过
read
对第一个字符设置超时来防止这种情况。如果超时,返回码将大于128,我们将知道STDIN管道(aka/dev/stdin
)为空。否则,我们将通过以下方式获得STDIN的其余部分:
IFS
仅将read
命令设置为NULL用
-r
用消除read的分隔符
-d ''
。最后,将其附加到我们最初获得的角色
从而...
__="" _stdin="" read -N1 -t1 __ && { (( $? <= 128 )) && { IFS= read -rd '' _stdin _stdin="$__$_stdin" } }这种技术避免了使用
var="$(command ...)"
Command Substitution,而Command Substitution在设计上总是会剥离任何尾随的换行符。如果首选Command Substitution,则为了保留尾随换行符,我们可以在的内部输出中附加一个或多个定界符
$()
,然后在外部将其删除。例如(注意
$(parens)
第一个命令和${braces}
第二个命令) ..._stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)" _stdin="${_stdin%|||}"