是否可以使用“xargs”将元素追加到数组中?

是否可以使用“xargs”将元素追加到数组中?

我有一个空数组

arr=()

我可以用来xargs将元素附加到该数组吗?

像这样:

echo "test" | xargs arr+=()

答案1

不,那是不可能的。该xargs工具根据其获得的输入量执行外部实用程序一次或多次。数组分配很可能不是外部实用程序的名称,因此它将无法运行。此外,由于该xargs工具本身是一个外部实用程序,因此它无法更改当前 shell 环境中的任何内容。

这样做会更容易

arr+=( test )

或者,如果您想从命令读入数组(命令输出的每行一个元素):

readarray -t -O "${#arr[@]}" arr < <( some_command )

这开始将新元素添加到数组的末尾arr,从输出中读取每一行some_command作为新的数组元素。该-O选项确定在数组中插入数据的偏移量,并将"${#arr[@]}"扩展到数组的长度arr。因此,我们将在数组当前末尾之后开始插入数据arr。效果是将元素附加到数组中。

测试前一个命令:

$ arr=( 1 2 3 )
$ readarray -t -O "${#arr[@]}" arr < <( printf 'a\nb\nc\n' )
$ printf '%s\n' "${arr[@]}"
1
2
3
a
b
c

1在此示例中,我从包含三个元素、2和的数组开始3,只是为了说明元素是附加的。数组一开始也可能是空的。

如果数组是已知的为空,或者如果你想 代替数组中的元素,然后使用不带选项的命令-O

readarray -t arr < <( some_command )

上面的命令将代替数组的所有元素arr,其中的元素取自命令的输出行some_command

另请参阅help mapfilebash手册(readarray命令和mapfile命令相同)。

答案2

当父进程(例如 Bash)启动子进程(例如 xargs)时,子进程会获取环境的副本(包括数组变量 arr),并且该进程可以更新该环境,但是当它退出时,不会传递该环境回到父进程。
所以,一般来说,你的问题的答案是否定的。

更重要的是,xargs 无法更新环境变量,它只执行其他命令。

相关内容