我有一个输出 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行”