Bash 数组 - 不工作

Bash 数组 - 不工作

做一些格式化的乐趣,玩弄 xargs 以及它如何将数据传递到脚本等,我在创建数组时遇到了一些麻烦。

alias lstest='ls | xargs --delimiter="\n" ~/.config/lsdif_color.sh'

for fileLine in "$@"
do
    if [[ $fileLine == total* ]]; then echo $fileLine;
    else 
        cols=($fileLine);
        echo ${#cols}, $l
        echo ${cols[0]}
        echo ${cols[$(( ${#cols}-1 ))]}
    fi;
done 

所以,这很好用。 “cols”数组显示了正确的长度,并且完美地输出了第一个和最后一个元素。

现在针对问题:

...
else
  # Method 1
  declare -a cw=(11 2 8 7 6 5 4 3 6 0);
  echo ${#cw}

  # Method 2
  widths=($(11 2 8 7 6 5 4 3 6 0));
  echo ${#widths}

  #Method 3
  cws[0]="11"
  cws[1]="2"
  cws[3]="8"
  cws[4]="7"
  cws[5]="6"
  cws[6]="5"
  cws[7]="4"
  cws[8]="3"
  cws[9]="6"
  cws[10]="0"

  echo ${#cws}

fi;

在尝试定义这些数组的所有三种方法中,回显长度始终为 2。而不是 10。上面的 Cols 数组列出了 10 个元素,但尝试创建数字数组失败,即使我让它们是字符串也是如此。

为什么?

感谢 Jaeden“Sifo Dyas”al'Raec Ruiner

答案1

你只需要使用:

echo {#cws[@]}
  • {#cws}通常用于返回字符串的长度
  • [@]很重要,因为如果没有这个, 的值$cws就不是整个数组,而是默认为数组值的第一个元素,又名$cws[0]

例如,在命令提示符下,我们可以创建一个与您类似的简单三元素数组:

$ cws[0]="11"; cws[1]="2"; cws[3]="8"

现在看看当我们引用时会发生什么$cws

$ echo $cws
11

所以,当使用 bash 扩展来确定某个东西的长度时,{#... },如果没有[@],你写${#cws}, $cwsis 11,所以你问 bash“11 的长度是多少”?当然,bash 会查看11包含两个字符的字符串,因此 Bash 会说“哦,这是 2”:

$ echo ${#cws}
2

因此,这就是为什么要指定数组的长度,请记住[@]

$ echo ${#cws[@]}
3

答案2

问题在于如何引用数组。开始:

$ declare -a cw=(11 2 8 7 6 5 4 3 6 0)

现在,让我们用两种不同的方式来看看长度:

$ echo ${#cw}
2
$ echo ${#cw[@]}
10

第一个方法返回索引 0 的元素的长度(在本例中它也恰好是 的第一个元素cw)。相比之下,第二种方法返回数组中的元素数量。

更多的

问题里有这样一段代码:

widths=($(11 2 8 7 6 5 4 3 6 0));

11此代码尝试执行带有参数的命令2 8 7 6 5 4 3 6 0。结果取决于是否存在名为 的命令11。如果没有,您将看到:

bash: 11: command not found

相关内容