Это:
set arrname = ("x" "nx" "y" "ny" "z" "nz")
обычное присваивание массива (BTW, кавычки не нужны в этом случае).
Это:
set arrname = (x,nx,y,ny,z,nz)
также делает $arrname
массив, но это имеет только один элемент со значением 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 анализируют аргументы команды. Я использовал csh и tcsh в течение многих десятилетий сам (хотя я недавно переключился главным образом для избиения), и я обычно сталкиваюсь со случаями как это, где я должен экспериментировать, чтобы определить, как что-то собирается работать.
Если Вы хотите установить $arrname
к значению массива используйте круглые скобки и не используйте запятые.
И как barmar упомянутый в комментарии, необходимо считать это:
http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/
csh и tcsh действительно имеют несколько более удобный синтаксис массива, чем удар имеет. В csh и tcsh, можно обратиться к 3-му элементу массива как $arrname[3]
; в ударе необходимо добавить фигурные скобки: ${arrname[3]}
. Кроме того, массивы удара на основе 0, в то время как массивы csh/tcsh на основе 1. Но большая непротиворечивость синтаксиса и семантики удара, по моему скромному мнению, больше, чем восполняет это.
Некоторые примеры простого массива, в 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
( [@]
и [*]
синтаксис ведет себя тонко по-другому; см. документацию удара для деталей.)