【问题标题】:How to return array from bash function [duplicate]如何从bash函数返回数组[重复]
【发布时间】:2019-10-20 17:54:17
【问题描述】:

我想从 bash 上的函数返回一个数组,并在另一个函数中使用这个数组。但是我得到的是一个字符串,而不是一个数组,请你帮我看看如何从 bash 函数返回一个数组,我是 bash 脚本的新手,谢谢。

array(){
          local words=("a a" "b b" "c c")
           echo ${words[@]}
    }

    getWord(){
           words=$(array)
           for word in "${words[@]}"; do
                echo "$word"
            done
    }

    getWord

它返回a a b b c c 的字符串,但我的预期结果应该是一个数组。

【问题讨论】:

    标签: arrays bash shell


    【解决方案1】:

    其实看你的代码,你不需要返回任何东西; “words”变量是全局变量,因此可以在整个脚本中使用。

    解决方法:

    编辑:

    #!/bin/bash
    
    array(){
           local words=("a" "b" "c")
           echo "${words[@]}"
    }
    
    getWord(){
           local arr=( $(array) )
           for word in "${arr[@]}"; do
                echo "$word"
            done
    }
    
    getWord
    

    EDIT2:

    #!/bin/bash
    
    orig_IFS="$IFS"
    array_IFS="," #Or whatever you want, mb a safer one
    
    array(){
           IFS="${array_IFS}"
           local words=("a a" "b b" "c c")
           echo "${words[*]}"
           IFS="${orig_IFS}"
    }
    
    getWord(){
           IFS="${array_IFS}"
           arr=( $(array) )
           IFS="${orig_IFS}"
           for word in "${arr[@]}"; do
                echo "$word"
            done
    }
    
    getWord
    

    EDIT3: 按照@Kamil Cuk 的建议

    #!/bin/bash
    
    array_IFS=$'\ca' #Maybe this is safer than using a single comma
    
    array(){
           IFS="${array_IFS}" local words=("a a" "b b" "c c")
           echo "${words[*]}"
    }
    
    getWord(){
           IFS="${array_IFS}" arr=( $(array) )
           for word in ${arr[@]}; do #we don't need double quotes anymore
                echo "$word"
            done
    }
    
    getWord
    

    注意细微差别。

    【讨论】:

    • sorry我已经修改了words变量是local的代码
    • 这样有什么好的理由吗?
    • 实际上,这段代码只是一个例子,主要问题是如何从一个函数返回一个数组并在另一个函数中使用它。
    • 使用全局变量。不过,您可以解决该问题。查看我的编辑。
    • IFS="${array_IFS}" <newline> arr=( $(array) ) 写成单行 IFS="$array_IFS" arr=( $(array) )。这样你就不需要保存 IFS。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2011-09-19
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多