私は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のマニュアルを参照してください。[@]
)[*]
答え2
{}はシェル拡張であり、中括弧拡張は任意の文字列を生成できるメカニズムです。中括弧拡張パターンは、オプションのPREAMBLE、その後に中括弧ペアの間にカンマで区切られた一連の文字列、最後にオプションのPOSTSCRIPT形式を取ります。プリアンブルは中括弧内に含まれる各文字列の接頭辞として機能し、PostScriptは各結果文字列に追加され、左から右に展開されます。詳細リンク
したがって、コンマを入力しても不足している}
エラーは発生しません。
set arrname = {"x","nx","y","ny","z","nz"}