如何在带条的命令行中为多个变量赋值

Ren*_*ger 11 shell bash

我基本上是在尝试将 shell 命令输出的某些部分分配给多个变量,但我不知道如何做到这一点。

为简单起见,假设 shell 上的命令在执行时打印

one two three four
Run Code Online (Sandbox Code Playgroud)

可以用一个模拟

echo "one two three four"
Run Code Online (Sandbox Code Playgroud)

(虽然实际的命令是不同的)

现在,我想将输出的第二个和第四个字(在本例中为)分配给变量w1w2

我以为我可以像这样使用read命令:

echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2
Run Code Online (Sandbox Code Playgroud)

但这不起作用,可能是因为读取命令是在子进程中执行的。

那么,我将如何实现我所追求的目标?

dog*_*ane 19

这不起作用,因为在read不能影响父级环境的子进程中运行。

您有几个选择:

您可以将命令转换为:

w1=$(echo "one two three four" | awk '{print $2}')
w2=$(echo "one two three four" | awk '{print $4}')
Run Code Online (Sandbox Code Playgroud)

或者,更改 IFS 并使用set

OIFS="$IFS"
IFS=' '
set -- $(echo "one two three four" | awk '{print $2" "$4}')
IFS="$OIFS"
w1=$1 w2=$2
Run Code Online (Sandbox Code Playgroud)

或这里字符串:

read w1 w2 w3 w4 <<< "one two three four"
Run Code Online (Sandbox Code Playgroud)

  • 基于 Here 字符串:读取 a1 a2 a3 &lt;&lt;&lt; $(echo 一二三) (4认同)