【问题标题】:How to use the arguments from `xargs` as the index of an array如何使用 `xargs` 中的参数作为数组的索引
【发布时间】:2017-02-28 22:55:02
【问题描述】:

我想使用xargs 中的参数作为这个数组的索引,这是脚本:

1 #!/bin/bash
2 array[0]=x
3 array[1]=y
4 echo array : ${array[0]}, ${array[1]}
5 echo -n {0..1} | xargs -I index -d" " echo index,${array[index]}

这是输出:

[usr@linux scripts]$ sh test.sh 
array : x, y
0,x
1,x 

你可以看到数组不能正确接受索引,它总是第一个。我怎样才能得到这种输出:

array : x, y
0,x
1,y

我用命令echo 展示了这个例子,然而,我真正的目标是另一个命令,像这样:

echo -n {0..1} | xargs -I index -d" " somecommand ${array[index]}

所以我想要这个问题的一般解决方案。
而且我还尝试了parallel 而不是xargs,它也有同样的问题。

【问题讨论】:

  • 这不可能按照你想要的方式工作,因为数组只存在于 shell 中,xargs 通过创建子进程来工作。 xargs 命令行中的${...} 内容仅在执行 xargs 之前展开一次。您必须使数组对子进程可用,或者将 xargs 重写为 shell 循环。
  • @WumpusQ.Wumbley 好的,但是,我想使用 xargs 进行并行处理,所以 shell 循环不是一个合适的解决方案 :(
  • 您可以尝试将数组作为列表放入环境中,并在以xargs 开头的命令中使用它,但可能存在极端情况...

标签: linux bash shell xargs gnu-parallel


【解决方案1】:
for i in `seq 0 $[${#array[@]}-1]`;do echo $i,${array[$i]};done|xargs -n1 echo

【讨论】:

  • 是的,避免这种问题是很困难的。但是,您的脚本应该稍作修正:for i in `seq 0 `expr ${#array[@]}-1``
【解决方案2】:

使用 GNU Parallel,您可以:

#!/bin/bash

. `which env_parallel.bash`

array[0]=x
array[1]=y
echo array : ${array[0]}, ${array[1]}
echo -n {0..1} | env_parallel -d" " echo '{},${array[{}]}'
# or
echo -n {0..1} | env_parallel --env array -d" " echo '{},${array[{}]}'

你的问题归结为导出数组,你不能不作弊:Exporting an array in bash script

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多