原标题:脚本来源时间接参数替换中断(zsh)
zsh 5.7.1 (x86_64-apple-darwin19.0)
GNU bash,版本 4.4.20(1)-release (x86_64-pc-linux-gnu)
我正在 Mac 上开发一个 shell 脚本,我试图让它在 bash 和 zsh 之间保持可移植性,所以数组索引是一个考虑因素。我知道我可以将 KSH_ARRAYS 设置为从 0 开始索引,但我决定在操作系统中查询正在使用的 shell 并相应地设置开始索引,这导致了下面描述的问题。
使用间接扩展是有道理的(无论如何对我来说!),这就是导致问题的原因。考虑脚本indirect.sh:
#! /bin/bash
declare -r ARRAY_START_BASH=0
declare -r ARRAY_START_ZSH=1
declare -r SHELL_BASH=0
declare -r SHELL_ZSH=1
# Indirect expansion is used to reference the values of the variables declared
# in this case statement e.g. ${!ARRAY_START}
case $(basename $SHELL) in
"bash" )
declare -r SHELL_ID=SHELL_BASH
declare -r ARRAY_START=ARRAY_START_BASH
;;
"zsh" )
declare -r SHELL_ID=SHELL_ZSH
declare -r ARRAY_START=ARRAY_START_ZSH
;;
* )
return 1
;;
esac
echo "Shell ID: ${!SHELL_ID} Index arrays from: ${!ARRAY_START}"
在同一目录中从命令行运行时,它工作正常:
<my home> ~ % echo "$(./indirect.sh)"
Shell ID: 1 Index arrays from: 1
当我获取脚本时出现问题:
<my home> ~ % echo "$(. ~/indirect.sh)"
/Users/<me>/indirect.sh:28: bad substitution
我不明白为什么采购脚本会改变参数扩展的行为。
这是预期的行为吗?如果是这样,如果有人可以解释它并希望提供解决方法,我将不胜感激。