声明对 zsh 和 bash 有效的数组



我正在寻找一种方法来声明一个可以在 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 中工作的东西,看起来不太奇特。

你对bash的假设是错误的。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

最新更新