bash,zsh:declare [*](哦,我的)

时间:2012-04-17 16:05:22

标签: bash zsh

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

$ declare -a THIS[*]

这在zsh中似乎是非法的(我得到“找不到匹配:这[*]”错误)。任何人都可以帮我翻译成zsh吗?

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

更新

提供代码使用位置的示例,并解释它是如何有效的 - 我已经从Eric Engstrom的帖子中复制了几行password free 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中的等效声明!

1 个答案:

答案 0 :(得分:3)

只有Bash有declare。 kshes和zsh有typeset。这些代码在所有这些代码中都是荒谬的,因为shell不同意解析声明命令的参数,例如declaretypeset(尤其是Bash,{{1}以特定的方式改变解析),它会在每个中做一个不同的不可预测的,有潜在危险的事情。

特别是Bash如何解释这一点 - 来自联机帮助页:

  

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

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

THIS*的含义取决于具体情况。在普通命令评估上下文中不加引号,它是仅匹配文字星号的字符类。如果在数组名称后面的参数扩展中使用它,它会将数组的所有元素扩展为由IFS的第一个字符分隔的单个单词。

bash中的

[*]声明变量,返回它们的值,设置属性,并影响函数范围。请参阅:http://wiki.bash-hackers.org/commands/builtin/declare

编辑:给出现在问题中的示例,在bash中,行为如上所述。应从declare中删除[*]。该代码还有许多其他问题,例如尝试将参数放入字符串,使用全部大写变量名称,并在脚本中使用declare而不是[,而这些脚本显然不是在最小的情况下运行POSIX sh。