Isto:
set arrname = ("x" "nx" "y" "ny" "z" "nz")
é uma atribuição de matriz comum (BTW, as aspas não são necessárias neste caso).
Isto:
set arrname = (x,nx,y,ny,z,nz)
também faz $arrname
uma matriz, mas tem apenas um elemento, com o valor x,nx,y,ny,z,nz
(as vírgulas não são especiais neste contexto).
Isto:
set arrname = {x,nx,y,ny,z,nz}
usa um padrão glob; Assim como {foo,bar}.txt
se expande para foo.txt bar.txt
, então {x,nx,y,ny,z,nz}
expande para x nx y ny z nz
.
Aparentemente, o tcsh permite que você use {x,nx,y,ny,z,nz}
como uma inicialização de array, mas se você mesmo expandi-lo para:
set arrname = x nx y ny z nz
define $arrname
para apenas x
e silenciosamente ignora os outros argumentos. Este é um dos muitos problemas estranhos na maneira como os argumentos do comando csh e tcsh parse. Eu usei csh e tcsh por décadas (embora eu mudei principalmente para bash), e eu costumo correr para casos como este, onde eu tenho que experimentar para determinar como algo vai funcionar.
Se você quiser definir $arrname
como um valor de matriz, use parênteses e não use vírgulas.
E como barmar mencionado em um comentário, você deve ler isto:
link
O csh e o tcsh têm uma sintaxe de array um pouco mais conveniente do que o bash. Em csh e tcsh, você pode se referir ao terceiro elemento de uma matriz como $arrname[3]
; no bash você tem que adicionar chaves: ${arrname[3]}
. Além disso, os arrays do bash são baseados em 0, enquanto os arrays do csh / tcsh são baseados em 1. Mas a maior consistência da sintaxe e semântica do bash, IMHO, mais do que compensa isso.
Alguns exemplos de array simples, em csh:
% set arr = ( 10 20 30 )
% echo $arr
10 20 30
% echo $arr[3]
30
e no bash:
$ arr=(10 20 30)
$ echo ${arr[@]}
10 20 30
$ echo ${arr[*]}
10 20 30
$ echo ${arr[2]}
30
(A sintaxe [@]
e [*]
se comporta de maneira sutilmente diferente; consulte a documentação do bash para obter detalhes.)