BASH 脚本:如何将每行命令输出分配给数组中的值?

BASH 脚本:如何将每行命令输出分配给数组中的值?

运行命令时,我得到 10 行输出。我想将第 2-4-6-8-10 行放入一个数组中。

每次运行命令时,顺序都会发生变化,因此我需要一次性执行此操作。我曾尝试运行我的命令并挑选出第 2 行,然后再次运行并挑选出第 4 行等,但由于顺序发生了变化,因此这不起作用:

value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')

MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")

答案1

readarraybashshell 和 GNU中使用sed

readarray -t my_array < <( my_command | sed '1~2d' )

内置函数readarray将行读入数组中。这些行是从进程替换中读取的。进程替换中的命令sed将仅输出读取的每隔一行my_command(也可以写入sed '1!n;d',或sed -n 'n;p'与标准一样sed)。

在 GNU 中sed,该地址对从 line 开始的每一行n~m进行寻址。为了方便起见,这是对标准的 GNU 扩展。mnsed

my_command命令只会被调用一次。

测试:

$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10

相关内容