ループと配列の操作を学びたいです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
注:構文の強調表示は誤解を招く可能性があります。