管道分配变量

Hea*_*ray 21 bash variable

为简单起见,我想做:

echo cart | assign spo;
echo $spo  
Run Code Online (Sandbox Code Playgroud)

输出:购物车

是否assign存在这样的应用程序?

我知道使用替换来做到这一点的所有方法。

Bru*_*ger 18

你可以做这样的事情,如果你使用bash

echo cart | while read spo; do echo $spo; done
Run Code Online (Sandbox Code Playgroud)

不幸的是,变量“spo”不会存在于 while-do-done 循环之外。如果您可以在 while 循环中完成您想做的事情,那就行了。

实际上,您几乎可以在 ATT ksh(不是在 pdksh 或 mksh 中)或在神话般的 zsh 中执行上面写的几乎完全相同的操作:

% echo cart | read spo
% echo $spo
cart
Run Code Online (Sandbox Code Playgroud)

因此,另一种解决方案是使用 ksh 或 zsh。


Sté*_*las 12

echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }
Run Code Online (Sandbox Code Playgroud)

只要只输出echo一行,就可以工作(将没有尾随换行符的输出存储到spo变量中)echo

你总是可以这样做:

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)
Run Code Online (Sandbox Code Playgroud)

以下解决方案适用于bash脚本,但不适用于bash提示符:

shopt -s lastpipe
echo cat | assign spo
Run Code Online (Sandbox Code Playgroud)

或者:

shopt -s lastpipe
whatever | IFS= read -rd '' spo
Run Code Online (Sandbox Code Playgroud)

要存储的输出whatever上升到第NULL字符(bash变量不能存放反正NULL字符)的$spo

或者:

shopt -s lastpipe
whatever | readarray -t spo
Run Code Online (Sandbox Code Playgroud)

将 的输出存储whatever$spo 数组中(每个数组元素一行)。