4

我正在使用具有以下语法的 bash 脚本

$ declare -a THIS[*]

这在 zsh 中似乎是非法的(我收到“找不到匹配项:THIS[*]”错误)。谁能帮我把它翻译成zsh?

另外 -[*]语法是什么意思?(我知道我们正在声明一个数组,但为什么是 [*]?)

更新

为了提供一个使用代码的示例,并解释它是如何有效的 - 我从 Eric Engstrom 的关于无密码 ssh的帖子中复制了几行

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中的等效声明!

4

1 回答 1

3

只有 Bash 有declare。kshes 和 zsh 有typeset. 该代码在所有代码中都是无意义的,并且由于 shell 不同意解析声明命令的参数,例如declareand typeset(特别是 Bash,-a以特定方式改变解析),它将在每个。

具体来说,Bash 是如何解释这一点的——来自手册页:

declare -a name[subscript] 也被接受;下标被忽略。

因此,由于它没有被引用——如果当前目录中有一个名为的文件,THIS*那么由于路径名扩展,Bash 会抛出一个非法名称错误。否则它只会创建一个名为“THIS”的空数组。

什么[*]意思取决于上下文。在普通命令评估上下文中未引用,它是一个仅匹配文字星号的字符类。如果在数组名称后面的参数扩展中使用,它将数组的所有元素扩展为由 IFS 的第一个字符分隔的单个单词。

declare在 bash 中声明变量、返回它们的值、设置属性并影响函数范围。见:http ://wiki.bash-hackers.org/commands/builtin/declare

编辑:鉴于现在问题中的示例,在 bash 中,行为如上所述。[*]应该从declare. 该代码还有许多其他问题,例如尝试将参数放入字符串、使用全大写变量名以及在显然不打算在最小 POSIX sh 上运行的脚本中使用[而不是。[[

于 2012-04-17T16:31:49.877 回答