我使用sed
with<<<
和read
将字符串中的所有单词分配给变量。我所做的是:
read -a A0 <<< $(sed '2q;d' /proc/stat)
因此,sed
读取文件的第二行file
并立即退出。已读入的行将sed
被输入,<<<
它会扩展它接收到的输入sed
并将read -a
结果值分配<<<
给数组的元素。以这种方式使用<<<
andsed
是一个好主意还是有明显的理由反对这种做法,最重要的是,是否有更快的方法来做到这一点?
答案1
可以直接使用数组赋值:
A0=($(sed '2q;d' /proc/stat))
请注意,这会执行通配符:如果命令的输出包含 shell 通配符,则包含通配符的单词将被匹配文件列表(如果有)替换。如果命令的输出可能包含字符之一\[?*
,请暂时关闭通配符:
set -f
A0=($(sed '2q;d' /proc/stat))
set +f
这比使用以下方法要快一点read
:
$ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done
real 0m2.829s
user 0m0.220s
sys 0m0.480s
$ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done
real 0m2.388s
user 0m0.128s
sys 0m0.276s
对于bash
4.0 及更高版本,您可以使用mapfile
:
mapfile -t < <(sed '2q;d' /proc/stat)
但mapfile
似乎是最慢的:
$ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done
real 0m3.990s
user 0m0.104s
sys 0m0.444s
答案2
在我看来,语法似乎太复杂了。我会改用以下内容:
read -a A0 < <( sed '2q;d' /proc/stat )
<<< word
当我需要一个命令从变量而不是另一个命令获取输入时,我通常使用该语法。