2012-04-17 11 views
3

を宣言し、私は(私が見つけた「何の一致を得ていない。これは、zshのでは違法であると考えられる次の構文bashの、zshの:[*](私のオハイオ州)

$ declare -a THIS[*] 

を持っているbashスクリプトで働いています:THIS [*] "エラー)。誰かがこれをzshに翻訳するのを助けることができますか?

また、[*]の構文は何ですか? (私たちは、配列を宣言している知っているが、なぜ[*]?)

コードが使用される場合の例を提供し、それが有効である方法を説明するためにアップデート - 私はしました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 
} 

にエリックEngstromのポストから数行をコピーした私は(我々はそれが後で必要がありますどのように多くの項目がわからないよう)[*]がダイナミックイテレータのいくつかの種類として使用されていると信じています。私はちょうどzshの同等の宣言を知りたいです!

+0

"(oh my)"とはどういう意味ですか? – Shahbaz

+1

ライオンズ、トラ、ベア... – danodonovan

+1

zshでどの位のスペースが占めるかを制御する方法はまったくありません(読み込み専用にしない限り)ので、 'declare -a SSSHA_KEYS'を実行してみてください。 @ormaajの説明を信頼すると、これらの宣言は同等でなければなりません。他の投稿されたコードは、 'SSSHA_KEYS [$ {#SSSHA_KEYS [*]}] = smth'を除いて変更なしで動作する可能性が高いです。 zsh配列のインデックスは1から始まり、 'ARR [ARR_LENGTH]'は最後の項目に割り当てられ、後ろには割り当てられないので、 'SSHA_KEYS + =(smth)'を使用してください。 – ZyX

答えて

3

Bashのみがdeclareです。 kshesとzshにはtypesetがあります。そのコードはすべて意味がなく、の宣言コマンド(とtypeset)の構文解析に関してシェルが異論を唱えているので(具体的にはBashでは-aの構文解析が変更されます)、別の予測不可能な、潜在的にそれぞれ危険なものです。

具体バッシュはこれを解釈する方法 - マンページから:

が-a名[添字]も受け入れられ宣言します。添字は無視されます。だから、

それが引用符で囲まれていないだから - THIS*という名前のカレントディレクトリ内のファイルがありますならば、bashのが原因パス名展開に不正な名前のエラーをスローしていました。それ以外の場合は、 "THIS"という名前の空の配列が作成されます。

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

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

編集:上記のような振る舞いがあるbashで、問題の今だ例を考えると。 から[*]を削除する必要があります。そのコードには、文字列に引数を入れようとすると、オールキャップの変数名を使用し、[[の代わりに[を最低限のPOSIX shで実行する予定のスクリプトに使用するなど、さまざまな問題があります。

+0

Zshは 'declare'を持っていますが、typesetのエイリアスです。注意: 'emulate bash'を実行すると' declare -a THIS [*] 'と表示され、' THIS'が定義されていない場合、 'declare:THIS [*]:ローカル配列要素を作成できません。 'declare:THIS [*]:' THIS'が 'declare -a THIS'で定義されている場合、配列要素はスカラーでなければなりません。私は何を宣言しているのか分かりません。それは何とか言われているので、何も言えません。 – ZyX

+0

* 'emulate bash'は' emulate sh'と同じです。 – ZyX

+0

@ ZyXはい、私はそれが互換性機能の一部として '宣言 'していたはずです。私はいくつかのBashのみのコーナーケースを考えることができますが、これだけではこのようなことが起こるかもしれませんが、彼らは確かにほとんどの人が知っているか気にするものではなく、ここでは間違いありません他のほとんどは間接的な拡張を伴う)。 – ormaaj

関連する問題