我有一个空数组
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 mapfile
和bash
手册(readarray
命令和mapfile
命令相同)。
答案2
当父进程(例如 Bash)启动子进程(例如 xargs)时,子进程会获取环境的副本(包括数组变量 arr),并且该进程可以更新该环境,但是当它退出时,不会传递该环境回到父进程。
所以,一般来说,你的问题的答案是否定的。
更重要的是,xargs 无法更新环境变量,它只执行其他命令。