通过在换行符上拆分来解构分配 zsh

通过在换行符上拆分来解构分配 zsh

我有一个输出 2 行的命令,

% ./run
one
two
%

所以输出是one\ntwo\n

如何分别将变量first和分配second给第一行和第二行?

我知道如何通过运行命令两次来完成这两个任务:

% first="$(./run | head -n 1)"
% second="$(./run | tail -n 1)"

我不想运行./run两次,我只想调用一次(每次输出可能不同)

我可以将./run的输出存储在变量中,然后对该变量进行操作,但是我可以避免使用这个临时变量吗?

越来越多的高级语言正在添加解构赋值:

first, second = (./run).split('\n')

我可以在 zsh 中完成类似的事情吗?

答案1

通过单独的调用来读取每一行read

IFS= read -r first
IFS= read -r second

例如:

$ unset first second
$ printf 'one\ntwo\n' | { IFS= read -r first; IFS= read -r second; }
$ print $first
one
$ print $second
two

上面的方法之所以有效,只是因为zsh不在单独的子 shell 中运行管道的右侧。

或者,通过流程替换:

$ unset first second
$ { IFS= read -r first; IFS= read -r second; } < <( printf 'one\ntwo\n' )
$ print $first
one
$ print $second
two

也可以看看理解“IFS=读取-r行”

相关内容