내 C 쉘 스크립트(특히 tcsh)에서 x, nx, y, ny, z, nz의 6개 값을 가진 배열을 선언하려고 했습니다. 몇 번의 시행착오 끝에 원하는 배열을 선언하는 세 가지 방법을 찾았습니다.
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 }.
내 질문은 내가 나열한 네 번째 문이 작동하지 않게 만드는 ()와 {}의 차이점이 무엇입니까?
답변1
이것:
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를 사용해 왔으며(비록 최근에는 대부분 bash로 전환했지만), 어떤 것이 어떻게 작동하는지 알아내기 위해 실험을 해야 하는 상황에 자주 직면합니다.
$arrname
배열 값으로 설정하려면 괄호를 사용한 다음아니요쉼표를 사용하세요.
Bamar가 의견에서 언급했듯이 다음 내용을 읽어야 합니다.
http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/
csh와 tcsh는 bash보다 더 편리한 배열 구문을 가지고 있습니다. csh와 tcsh에서는 배열의 세 번째 요소를 로 참조할 수 있습니다 $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 형식을 취합니다. 프리앰블은 중괄호 안에 포함된 각 문자열의 접두사 역할을 하며, 포스트스크립트는 각 결과 문자열에 추가되어 왼쪽에서 오른쪽으로 확장됩니다.상세링크
따라서 쉼표를 입력하면 누락된 }
오류가 발생하지 않습니다.
set arrname = {"x","nx","y","ny","z","nz"}