为了简单起见,我想做:
echo cart | assign spo;
echo $spo
输出: 购物车
这样的assign
应用存在吗?
我知道使用替换来做到这一点的所有方法。
答案1
如果你使用的话,你可以做这样的事情bash
:
echo cart | while read spo; do echo $spo; done
不幸的是,变量“spo”不会存在于 while-do-done 循环之外。如果你能在 while 循环中完成你想要的事情,那就行了。
实际上,您几乎可以完全按照上面在 ATT ksh(不是 pdksh 或 mksh)或精彩的 zsh 中编写的内容进行操作:
% echo cart | read spo
% echo $spo
cart
因此,另一种解决方案是使用 ksh 或 zsh。
答案2
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }
只要仅输出一行,就可以工作(echo
将不带尾随换行符的输出存储到变量中)。spo
echo
你总是可以这样做:
assign() {
eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)
以下解决方案可以在bash
脚本中运行,但不能在bash
提示符下运行:
shopt -s lastpipe
echo cat | assign spo
或者:
shopt -s lastpipe
whatever | IFS= read -rd '' spo
whatever
将最多前一个 NUL 字符的输出存储bash
在$spo
.
或者:
shopt -s lastpipe
whatever | readarray -t spo
将输出存储whatever
在$spo
大批(每个数组元素一行)。
答案3
如果我正确理解了这个问题,你想将标准输出传递给一个变量。至少那是我一直在寻找并最终来到这里的。所以对于那些和我有同样命运的人:
spa=$(echo cart)
分配cart
给变量$spa
。
答案4
这是我对问题的解决方案。
# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
# b.) aliases don't take arguments, but we write this so that the "argument" appears
# behind the alias, making it appear as though it is taking one, which in turn
# becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"