代码之家  ›  专栏  ›  技术社区  ›  Hielke Walinga

对zsh和bash有效的数组声明

  •  0
  • Hielke Walinga  · 技术社区  · 7 年前

    我正在寻找一种方法来声明将在bash和zsh中工作的数组。

    我知道我可以在bash中这么做:

    file_list=$(example_command)
    

    在zsh我可以这样做:

    file_list=($(example_command))
    

    我知道如果我愿意的话,我可以用if语句来完成,但希望没有:

    if [ `basename $SHELL`=bash ]; then
        file_list=$(example_command)
    elif [ `basename $SHELL`=zsh ]; then 
        file_list=($(example_command))
    else
        echo "ERROR: UNKNOWN SHELL"
    fi
    

    我真的不在乎其他贝壳(如sh)。只是在寻找一些工作在zsh和bash这不是太异国情调期待。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Charles Duffy    7 年前

    你对巴什的假设是错误的。 file_list=$(example_command) 在那里创建一个数组。 file_list=( $(example_command) ) 在两个shell中创建一个数组,尽管这样做不是很好(不能处理带有空格的文件、其名称可以扩展为glob的文件等)。

    以下是一个良好的实践方法(就您而言 可以 在换行符分隔的流中调用处理文件名当换行符可以是文件名中的文字时的良好做法)在两个shell中都有效:

    file_list=( )
    while IFS= read -r line; do file_list+=( "$line" ); done < <(example_command)
    

    重要的是 使用 如果数组在两个shell中都有效,则需要将其展开为 "${file_list[@]}" 不是 $file_list .