Bash脚本:将数组作为参数传递给函数并打印数组

Bash脚本:将数组作为参数传递给函数并打印数组,bash,Bash,我将一个数组传递给一个函数,并尝试打印数组的每个元素 以下是在数组参数周围加引号的代码段: #!/bin/bash print_array () { array=$@ for i in "${array[@]}" #with quotes do echo $i done } ar=("1. a" "2. b" "3. c") print_array ${ar[@]} #!/bin/bash p

我将一个数组传递给一个函数,并尝试打印数组的每个元素

以下是在数组参数周围加引号的代码段:

#!/bin/bash

print_array ()
{
        array=$@
        for i in "${array[@]}" #with quotes
        do
                echo $i
        done
}

ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
#!/bin/bash

print_array ()
{
        array=$@
        for i in ${array[@]} #without quotes
        do
                echo $i
        done
}

ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
当我执行上面的脚本时,输出是

1. a 2. b 3. c
1.
a
2.
b
3.
c
以下是数组参数周围不带引号的代码段:

#!/bin/bash

print_array ()
{
        array=$@
        for i in "${array[@]}" #with quotes
        do
                echo $i
        done
}

ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
#!/bin/bash

print_array ()
{
        array=$@
        for i in ${array[@]} #without quotes
        do
                echo $i
        done
}

ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
当我执行上面的脚本时,输出是

1. a 2. b 3. c
1.
a
2.
b
3.
c
输出根据数组参数周围的引号而变化。 我真的对显示的输出感到困惑。请帮我解决这个问题

预期产出应为:

1. a
2. b
3. c
如果您想解释,可以在“$@”中为i编写

你也可以写:

#!/bin/bash

print_array ()
{
        array=("$@")
        for i in "${array[@]}"; do
                printf "%s\n" "$i"
        done
}

ar=("1. a" "2. b" "3. c")
print_array "${ar[@]}"  # with quotes
如果您想解释,可以在“$@”中为i编写

你也可以写:

#!/bin/bash

print_array ()
{
        array=("$@")
        for i in "${array[@]}"; do
                printf "%s\n" "$i"
        done
}

ar=("1. a" "2. b" "3. c")
print_array "${ar[@]}"  # with quotes
结果:

1. a
2. b
3. c
赋值期间使用=()将变量保持为数组

结果:

1. a
2. b
3. c

在赋值过程中使用=()将变量保持为数组。

不能将数组复制到标量中--标量只能保存单个数组元素,但不能超过该值而不丢失数据。不能将数组复制到标量中--标量只能保存单个数组元素,但不能超过该值而不丢失数据。IOW,
$@
是字符串,
(“$@”)
是数组
($@)
也是一个数组,但元素数不同。@sach,在函数内部和外部使用相同的名称
array
实际上是一个坏主意,因为默认情况下(没有显式的
local
声明),函数定义中的变量在作用域中实际上是全局的。@williampersell,为什么必须使用引号才能获得所需的输出。@sach,如果不使用引号,则会得到字符串拆分和全局扩展,因此字符串中的单个单词(通过在IFS中拆分字符来区分)将作为单个参数传递。为了获得更多的乐趣,请尝试在数组元素中传递由空格包围的文字星号字符,您将看到当您不引用时glob expansion会做什么。@sach,我不强烈推荐任何死树引用,但(以及常见问题解答、陷阱页等)上的文档是一个不错的选择(由那些非常关心正确性并展示良好实践的人积极维护)。注意,
$@
是一个字符串,
(“$@”)
是一个数组。
($@)
也是一个数组,但元素数不同。@sach在函数内外使用相同的名称
array
,实际上是一个坏主意,因为默认情况下(没有明确的
local
声明),函数定义中的变量实际上在作用域中是全局的。@Williampersell,为什么引号是必需的,才能得到所需的输出。@sach,如果不引号,则会得到字符串拆分和全局扩展,因此字符串中的单个字(通过在IFS中拆分字符来区分)作为单独的参数传递。为了增加乐趣,请尝试在数组元素中传递由空格包围的文字星号字符,您将看到当您不引用时glob expansion会做什么。@sach,我不强烈推荐任何死树引用,但推荐位于的文档(以及常见问题解答、陷阱页等)是一个很好的选择(由那些非常关心正确性并展示良好实践的人积极维护)。