Cシェル配列宣言構文、()、{}

Cシェル配列宣言構文、()、{}

私はCシェルスクリプト(特にtcsh)でx、nx、y、ny、z、nzの6つの値を持つ配列を宣言しようとしました。私はいくつかの試行錯誤の最後に希望の配列を宣言する3つの方法を見つけました。

set arrname = ("x" "nx" "y" "ny" "z" "nz")
set arrname = (x,nx,y,ny,z,nz)
set arrname = {x,nx,y,ny,z,nz}

ただし、次の行は機能しません。

set arrname = {"x" "nx" "y" "ny" "z" "nz"}

上記の行では、次のエラーが発生します。

Missing }.

私の質問は、私がリストした4番目のドアが機能しないようにする()と{}の違いは何ですか?

ベストアンサー1

これ:

set arrname = ("x" "nx" "y" "ny" "z" "nz")

一般的な配列割り当てです(この場合は引用符は必要ありません、btw)。

これ:

set arrname = (x,nx,y,ny,z,nz)

また、$arrname配列を作成しますが、要素と値が1つしかありませんx,nx,y,ny,z,nz(この場合、コンマは特別ではありません)。

これ:

set arrname = {x,nx,y,ny,z,nz}

グローバルパターンを使用{foo,bar}.txtして拡張foo.txt bar.txtします。{x,nx,y,ny,z,nz}x nx y ny z nz

明らかにtcshを使用すると配列初期化プログラムとして使用できますが、{x,nx,y,ny,z,nz}直接拡張すると次のようになります。

set arrname = x nx y ny z nz

他のパラメータは$arrname単に無視して自動的に無視するように設定されています。xこれは、cshとtcshがコマンド引数を解析する方法にある多くの奇妙な欠陥の1つです。私は何十年もの間、cshとtcshを使用してきました(最近はほとんどbashに切り替えましたが)、どのように機能するかを調べるために実験を行う必要がある状況によく直面しています。

$arrname配列値に設定するには、かっこを使用してからいいえカンマを使用してください。

Bamarがコメントで述べたように、次の内容を読んでください。

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

cshとtcshはbashよりも便利な配列構文を持っています。 cshとtcshでは、配列の3番目の要素をとして参照できます$arrname[3]。 bashでは中括弧を追加する必要があります${arrname[3]}。また、bash配列は0から始まり、csh / tcsh配列は1から始まります。しかし、bashの構文と意味体系のより大きな一貫性であるIMHOは、これを補完しても残ります。

cshのいくつかの簡単な配列の例:

% set arr = ( 10 20 30 )
% echo $arr
10 20 30
% echo $arr[3]
30

バッシュから:

$ arr=(10 20 30)
$ echo ${arr[@]}
10 20 30
$ echo ${arr[*]}
10 20 30
$ echo ${arr[2]}
30

(構文の動作は若干異なります。詳細はbashのマニュアルを参照してください。[@][*]

おすすめ記事