如何在循环的每次迭代中向 Bash 中的数组添加元素?

BH2*_*017 7 arrays bash

我的目录中有这个depends文件$PATH

#!/bin/bash
k=0
for i in "$@"
do
  DP[k]="nodejs-$i"
  k=$((k+1))
done

echo $DP
Run Code Online (Sandbox Code Playgroud)

我跑了depends js kd,它返回了:

nodejs-js
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶,因为我认为我会得到的结果是:

nodejs-js nodejs-kd
Run Code Online (Sandbox Code Playgroud)

因为循环的目的是向DP表单数组添加新元素nodejs-$i,其中是我运行脚本时$i提供给脚本的输入。depends我尝试使用此依赖脚本来代替:

#!/bin/bash
DP=()
for i in "$@"
do
  DP+=("nodejs-$i")
done

echo $DP
Run Code Online (Sandbox Code Playgroud)

但它返回了与输入完全相同的结果js kd(即输出是nodejs-js)。

Jay*_*got 6

您的脚本正确地将元素添加到数组中,请检查下面如何读取 DP 数组。

尝试一下:

#!/bin/bash
k=0
for i
do
  DP[k]="nodejs-$i"
  k=$((k+1))
done

printf "DP array size is %d\n" "${#DP[@]}"
printf "%s " "${DP[@]}"
printf "\n"
Run Code Online (Sandbox Code Playgroud)

--edited-- 请注意,鼓励新应用程序使用 printf 而不是 echo。

有趣 =>默认情况下,for语句循环遍历脚本的参数。

考试:

$ ./depends js kd
DP array size is 2
nodejs-js nodejs-kd
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,它应该是 `"${DP[@]}"` - 带引号 - 而不是 `${DP[*]}`。前者保留任何内部空白,而后者则不保留。此外,“echo”并未被弃用。如果您像这里一样显式使用“bash”,则其行为是一致的。当使用未指定的 `/bin/sh` 变体时,`echo` 会出现 `printf` 所不存在的不一致问题 - 但是,`printf` 本身可能根本不存在于此类 shell 中,因此这并不是真正的改进。 (2认同)