4

次の構文を持つbashスクリプトを使用しています

$ declare -a THIS[*]

これは zsh では違法のようです (「一致するものが見つかりません: THIS[*]」というエラーが表示されます)。これを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での同等の宣言を知りたいだけです!

4

1 に答える 1

3

Bash のみがdeclare. kshes と zsh にはtypeset. そのコードはそれらのすべてにおいて無意味であり、シェルはandのような宣言コマンドへの引数の解析について意見が一致しないため(特に Bash では、特定の方法で解析を変更します)、別の予測不能で潜在的に危険なことを実行します。各。declaretypeset-a

具体的には、Bash がこれをどのように解釈しているか - マンページから:

declare -a name[subscript] も受け入れられます。添字は無視されます。

したがって、引用符で囲まれていないため、現在のディレクトリに指定されたファイルがある場合THIS*、パス名の展開により、Bash は無効な名前エラーをスローします。それ以外の場合は、「THIS」という名前の空の配列が作成されます。

[*]を意味するかは文脈によって異なります。通常のコマンド評価コンテキストでは引用符で囲まれておらず、リテラル アスタリスクのみに一致する文字クラスです。配列名に続くパラメーター展開で使用すると、配列のすべての要素が IFS の最初の文字で区切られた 1 つの単語に展開されます。

declarein bash は変数を宣言し、それらの値を返し、属性を設定し、関数のスコープに影響を与えます。参照: http://wiki.bash-hackers.org/commands/builtin/declare

edit : 現在問題になっている例を考えると、bash での動作は上記のとおりです。[*]から を削除する必要がありますdeclare。そのコードには、引数を文字列に入れようとしたり、すべて大文字の変数名を使用したり、最小限の POSIX sh で実行することを明確に意図していないスクリプトで[代わりに使用するなど、他にも多くの問題があります。[[

于 2012-04-17T16:31:49.877 に答える