将数组值传递给命令参数

将数组值传递给命令参数

我正在尝试编写一个脚本,它对数组中的每个元素执行一个命令,而与数组中的值数量无关。但是,我想到的唯一解决方案如下(以命令为例watch):

watch ${ARRAY[0]}

watch ${ARRAY[1]}

watch ${ARRAY[2]}

...作为数组的位置,需要监视其他命令。

显然,这绝对不是我想要的,因为这取决于我在代码中写入的数组位置的数量,这显然是一个问题。我尝试过类似的事情:

watch "${ARRAY[*]}"

…但不管有没有双引号,它都不起作用。任何建议都将不胜感激。

答案1

${ARRAY[*]}首先,无论带引号还是不带引号,您几乎都不应该使用。在几乎所有情况下,您都应该使用"${ARRAY[@]}"(而不是双引号。其次,应使用小写或大小写混合的变量名,以避免意外使用对 shell 或从中运行的某个程序具有特殊含义的名称。

现在,对于您的实际问题:您是想运行watch一次,然后将数组中元素的完整列表传递给它,还是想一次为每个元素单独运行它,或者一次watch为每个元素运行一个单独的实例?要使用完整列表运行一次,请使用:

watch "${array[@]}"

要对每个元素分别运行它,请使用:

for element in "${array[@]}"; do
    watch "$element"
done

要对每个元素分别运行它,请使用它&来避免在开始下一个命令之前等待每个watch命令完成:

for element in "${array[@]}"; do
    watch "$element" &
done
wait   # this waits for all of the `watch` processes to exit before continuing through the script

相关内容