管道分配变量

管道分配变量

为了简单起见,我想做:

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将不带尾随换行符的输出存储到变量中)。spoecho

你总是可以这样做:

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"

相关内容