我正在使用具有以下语法的 bash 脚本
$ declare -a THIS[*]
这在 zsh 中似乎是非法的(我收到“未找到匹配项:THIS[*]”错误)。谁能帮我把它翻译成 zsh 吗?
另外 - 什么是[*]
语法是什么意思? (我知道我们正在声明一个数组,但为什么要使用 [*]?)
update
为了提供代码使用位置的示例,并解释它如何有效 - 我从 Eric Engstrom 的帖子中复制了几行免密码 ssh http://www.mtu.net/~engstrom/ssh-agent.php
declare -a SSSHA_KEYS[*]
# --- PARSE ARGS --- #
sssha_parse_args() {
local OPTIND=1
while getopts "xe:k:t:" OPT; do
#echo "$OPT $OPTARG $OPTIND"
case $OPT in
t) SSSHA_ARGS="-t $OPTARG" ;;
e) SSSHA_ENV="$OPTARG" ;;
k) [ -f "${OPTARG}" ] && SSSHA_KEYS[${#SSSHA_KEYS[*]}]="$OPTARG" ;;
x) SSSHA_STOP_ON_EXIT=$OPT
esac
done
shift $(($OPTIND - 1))
# set default key, if none specified
if [ -z "${SSSHA_KEYS[*]}" ]; then
for key in $HOME/.ssh/id_[rd]sa; do
[ -f "$key" ] && SSSHA_KEYS[${#SSSHA_KEYS[*]}]="$key"
done
fi
}
我相信[*]
被用作某种动态迭代器(因为我们不知道它以后会有多少项)。我只是想知道 zsh 中的等效声明!
只有 Bash 有declare
。 kshes 和 zsh 有typeset
。该代码在所有代码中都是无意义的,并且由于 shell 不同意对参数的解析声明命令 like declare
and typeset
(特别是 Bash,-a
以特定方式改变解析),它会在每一个中做不同的不可预测的、潜在危险的事情。
具体来说,Bash 是如何解释这一点的 - 来自联机帮助页:
声明 -a name[下标] 也被接受;下标被忽略。
因此,由于它没有被引用 - 如果当前目录中有一个名为THIS*
那么 Bash 会由于路径名扩展而抛出非法名称错误。否则它只会创建一个名为“THIS”的空数组。
What [*]
手段取决于上下文。在普通命令评估上下文中不加引号,它是仅匹配字面星号的字符类。如果在数组名称后面的参数扩展中使用,它将数组的所有元素扩展为单个单词,并由 IFS 的第一个字符分隔。
declare
在 bash 中声明变量、返回其值、设置属性并影响函数作用域。看:http://wiki.bash-hackers.org/commands/builtin/declare http://wiki.bash-hackers.org/commands/builtin/declare
edit:鉴于现在问题中的示例,在 bash 中,行为如上所述。这[*]
应该从declare
。该代码还有许多其他问题,例如尝试将参数放入字符串、使用全大写变量名以及使用[
代替[[
在一个显然不打算在最小的 POSIX sh 上运行的脚本中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)