我用0初始化数组时做错了什么?

时间:2017-04-24 19:04:40

标签: linux bash shell

当我检查数组的长度总是1时,即使我在命令行中提供更多参数

for i in $*
do 
echo $i
conect[$i]=0
done

echo ${#conect}

3 个答案:

答案 0 :(得分:3)

试试这个:

#!/bin/bash
declare -A conect
for i in "$@"
do
    echo $i
    conect[$i]=0
done
echo ${#conect[@]}

说明:

  • 关联数组(即索引可以是非数字的)必须使用declare -A声明。如果保证索引是数字,则不需要此。
  • ${#foo}是字符串值变量的长度(字符数); ${#conect[@]}是数组的长度(元素数)。
  • 正如其他人所指出的,"$@"优于$*,尤其是当(引用)参数可能包含空格时。

答案 1 :(得分:0)

$ *创建一个用IFS分隔的单个参数。这就是原因。使用$ @

What is the difference between "$@" and "$*" in Bash?

修改 实际上,正如@that_other_guy和@Ruud_Helderman指出的那样(感谢你们两位),我所说的并不是对的。

首先是Mea Culpa,因为这不是完整的解决方案。

但它让我感到奇怪,所以这里是正确的方法。 IFS差异是一个事实。但是,如果你引用" $ *"或" $ @"

for i in "$*"
do
     echo $i
done

将在同一行输出每个参数,而

for i in "$@"
do
     echo $i
done

一次只做一个。

答案 2 :(得分:0)

您应该使用数组:

for i in "$@"