我想做的是以下内容:
stdin入变量AAA,而不会失去定界符符号(\n,\r,\t等)到另一个命令目前的问题是,我无法用read命令读取它,因为它停止在换行时读取.
我可以读取stdin cat,像这样:
my_var=`cat /dev/stdin`
Run Code Online (Sandbox Code Playgroud)
,但后来我不知道如何打印它.因此换行符,制表符和其他分隔符仍然存在.
我的示例脚本如下所示:
#!/usr/local/bin/bash
A=`cat /dev/stdin`
if [ ${#A} -eq 0 ]; then
exit 0
else
cat ${A} | /usr/local/sbin/nextcommand
fi
Run Code Online (Sandbox Code Playgroud)
Tan*_*lus 64
这对我有用:
myvar=`cat`
echo "$myvar"
Run Code Online (Sandbox Code Playgroud)
引号$myvar很重要.
Ing*_*kat 25
在Bash中,还有另一种方式; man bash提到:
命令替换
$(cat file)可以替换为等效但更快$(< file).
$ myVar=$(</dev/stdin)
hello
this is test
$ echo "$myVar"
hello
this is test
Run Code Online (Sandbox Code Playgroud)
小智 7
是的它也适合我.谢谢.
myvar=`cat`
Run Code Online (Sandbox Code Playgroud)
是相同的
myvar=`cat /dev/stdin`
Run Code Online (Sandbox Code Playgroud)
嗯,是.从bash手册页:
用双引号括起字符会保留引号内所有字符的字面值,但$,`,\除外,并且,当启用历史记录扩展时,!字符$和`在双引号中保留其特殊含义.
如果您确实关心在输出末尾保留尾随换行符,请使用以下命令:
myVar=$(cat; echo x)
myVar=${myVar%x}
printf %s "$myVar"
Run Code Online (Sandbox Code Playgroud)
这使用了这里的技巧。
如果管道中没有任何东西,此作业将无限期挂起。
var="$(< /dev/stdin)"
Run Code Online (Sandbox Code Playgroud)
我们可以通过read对第一个字符设置超时来防止这种情况。如果超时,返回码将大于128,我们将知道STDIN管道(aka /dev/stdin)为空。
否则,我们将通过以下方式获得STDIN的其余部分:
IFS仅将read命令设置为NULL-r-d ''。从而...
__=""
_stdin=""
read -N1 -t1 __ && {
(( $? <= 128 )) && {
IFS= read -rd '' _stdin
_stdin="$__$_stdin"
}
}
Run Code Online (Sandbox Code Playgroud)
这种技术避免了使用var="$(command ...)"Command Substitution,而Command Substitution在设计上总是会剥离任何尾随的换行符。
如果首选Command Substitution,则为了保留尾随换行符,我们可以在的内部输出中附加一个或多个定界符$(),然后在外部将其删除。
例如(注意$(parens)第一个命令和${braces}第二个命令) ...
_stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
_stdin="${_stdin%|||}"
Run Code Online (Sandbox Code Playgroud)