TCSHシェルで配列ループを使用する

TCSHシェルで配列ループを使用する

TCSHから:

異なるファイルを含む2つのリストがあります。その後、このリストを配列要素に渡す必要があり、リストは2つしかないので、ループを2回実行する必要があります。ただし、この場合、ループの実行には2つのリストのファイルと同じくらい時間がかかります。

set list_one = (one.s two.s three.s)
set list_two = (four.s five.s)

set arr=($list_one $list_two)

foreach i ($arr)
cat $i > $output.s
end

ここに私のコードサンプルがあります。私の考えでは、ループは2回だけ実行する必要があります(forと)がlist_one5list_two回実行されます(for one.s two.s three.s four.s five.s)。

答え1

このアクションはset arr=($list_one $list_two)リストを1つにマージします。

ここで何を探しているのかわかりませんが、次のようにリスト名を繰り返すことができます。

set names=(list_one list_two)

foreach i ($names)
    echo $i
end

しかし、変数に最初の2つのリストの名前がある場合、そこで最初の2つのリストを実際に使用する方が難しいようです。 tcshが間接変数参照(経由を除く)をサポートしているかどうかが見つかりませんeval。これはうまくいくようですが、評価で正しく引用するのは難しいようです。

#!/usr/bin/tcsh
set l1 = (aa bb cc)
set l2 = (dd ee)
set names = (l1 l2)

foreach i ($names)
    eval set x = \(\$$i\)
    foreach j ($x)
        echo $i $j
    end
end

しかし、空白を含む値が分割されていますが、この問題をどのように解決するのかわかりません。


正直なところ、私はTcshを捨て、Zshでも同じことをします。

l1=(aa bb cc)
l2=(cc dd)
names=(l1 l2)

for i in $names; do
    for j in ${(P)i}; do
        echo $i $j
    done
done

値のスペースを処理する必要がありますが、空の要素は削除されます。

関連情報