zshの配列とループ

zshの配列とループ

ループと配列の操作を学びたいですzsh

zshに2つの同じ配列があるとしましょう。未知#要素、それぞれパスのリストを含みます。

LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3)
REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3)

次のことができるように、共通のインデックスを使用して両方の配列を同時に繰り返したいと思います。

cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i

各繰り返しで。 zshでどうすればいいですか?

また、ループ制御と配列を検索しました。zsh ドキュメントしかし、ほとんど成功していませんでした。良いものもありますか?地図時間基本を紹介しました。サイクルソートzshで待っていますか? BashやShellスクリプトの経験はありませんが、プログラミングの背景知識を持つ人に適していますか?

答え1

部分15.2.1 「配列の添字化」配列はインデックスとして使用でき[exp](ここexpでは数値式)、要素がインデックス1(KSH_ARRAYSまたは設定されている場合は0)で始まることを示します。

部分14.3 「パラメータ拡張」構文が${#array_name}配列要素の数まで拡張されることを示します。

部分6.3 「複雑なコマンド」数を繰り返す構文を提供しますfor(例:C言語)
for (( initExpr ; testExpr ; stepExpr )) do … done

一緒に入れてください:

for (( i = 1; i <= $#LOCAL_PATH; i++ )) do
    ( # subshell to contain the effect of the chdir
        cd $LOCAL_PATH[i]
        hg pull $REMOTE_PATH[i]
    )
done

または以下を使用する場合KSH_ARRAYS

for (( i = 0; i < ${#LOCAL_PATH[@]}; i++ )) do
    ( # subshell to contain the effect of the chdir
        cd ${LOCAL_PATH[i]}
        hg pull ${REMOTE_PATH[i]}
    )
done

を使用すると、KSH_ARRAYS配列はインデックス0から始まり、配列式に中括弧を使用し、次のように解釈$arrayされます$array[0](配列長式を変更する必要があります)。必要な構文の変更KSH_ARRAYはなくても機能しますKSH_ARRAYが、まださまざまなインデックス範囲(1〜N対0〜N-1)のロジックを調整する必要があります。

答え2

あなたはできます圧縮2つの配列を作成し、2つの変数を使用して繰り返します。たとえば、次のようになります。

LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3)
REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3)

for local remote (${LOCAL_ARRAY:^REMOTE_ARRAY}) (
  cd $local &&
   hg pull $remote
)

答え3

2つの配列を制御できる場合は、それを連想配列(Ruby / Perlの「hash」、C ++の「map」、Javaの「HashMap」、または「dict」)に結合することもできます。

typeset -A remotes
remotes=(
  local1 remote1
  local2 remote2
)

for local remote in "${(@kv)remotes}"  # (kv) means key and value
                                       # and (@) within quotes is to
                                       # preserve empty ones (in your
                                       # case ${(kv)remotes} would be
                                       # enough as file paths are not
                                       # meant to be empty).
do
    (
        cd $local &&
          hg pull $remote
    )
done

注:構文の強調表示は誤解を招く可能性があります。

関連情報