做一些格式化的乐趣,玩弄 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}
, $cws
is 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