【问题标题】:Bash Script : Passing array as an argument to a function and printing the arrayBash 脚本:将数组作为参数传递给函数并打印数组
【发布时间】:2020-03-24 11:07:26
【问题描述】:

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

下面是代码 sn-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[@]}

当我执行上面的脚本时,输出是

1. a 2. b 3. c

下面是数组参数不带引号的代码sn-p:

#!/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

【问题讨论】:

  • 你不能将一个数组复制到一个标量中——一个标量只能保存一个数组元素,但不会丢失数据。

标签: bash


【解决方案1】:
#!/bin/bash

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

ar=("1. a" "2. b" "3. c")
print_array "${ar[@]}"

结果:

1. a
2. b
3. c

在赋值期间使用 =() 将变量保留为数组。

【讨论】:

    【解决方案2】:
    #!/bin/bash
    
    print_array ()
    {
            for i;
            do
                    printf "%s\n" "$i"
            done
    }
    
    ar=("1. a" "2. b" "3. c")
    print_array "${ar[@]}"  # with quotes
    

    如果要显式,可以写for i in "$@"

    你也可以写:

    #!/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
    

    【讨论】:

    • IOW,$@ 是一个字符串,("$@") 是一个数组。 ($@) 也是一个数组,但元素数量不同。
    • @sach,在函数内部和外部使用相同的名称 array 实际上是个坏主意,因为默认情况下(没有明确的 local 声明),函数定义中的变量实际上是全球范围内。
    • @WilliamPursell,为什么要获得所需的输出必须使用引号。
    • @sach,如果不引用,则会得到字符串拆分和全局扩展,因此字符串中的单个单词(通过在 IFS 中拆分字符来区分)作为单个参数传递。为了获得更多乐趣,请尝试在数组元素中传递由您的空格之一包围的文字星号字符,您将看到不引用时 glob 扩展的作用。
    • @sach,我不强烈推荐任何死树参考,但mywiki.wooledge.org/BashGuide 的文档(还有常见问题解答、陷阱页面等)是一个不错的选择(由人们积极维护非常关心正确性和展示良好实践的人)。
    猜你喜欢
    • 2017-09-26
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多