tcsh에서 실행된 bash 스크립트의 구문 오류

tcsh에서 실행된 bash 스크립트의 구문 오류

숫자 목록의 첫 번째 또는 두 번째 필드가 146인지 확인하기 위해 다음 줄을 작성했습니다.

에서 라인을 실행하고 싶습니다 tcsh. 그 중 하나는 로 설명됩니다 bash.

여기서 문제가 무엇입니까?

echo $numbers
146 146 0 16 16 10 42 12 10 32 32 3 2 32 26
tcsh

bash -c 'for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i  -d' ' ` ]; then echo "NUM is OK "; fi done'

실수:

` ]; then echo "NUM is OK "; fi done: -c: line 0: unexpected EOF while looking for matching ``'
` ]; then echo "NUM is OK "; fi done: -c: line 1: syntax error: unexpected end of file

답변1

"스크립트"에는 몇 가지 문제가 있습니다. 가장 큰 문제는 '어떤 형태의 이스케이프가 필요하다는 것입니다. 큰 따옴표로 묶인 문자열 안의 백틱 내부는 번거로울 수 있습니다.

$()대신 역따옴표를 사용하고 큰 따옴표를 구분 기호로 사용하지 않으면 이를 완전히 피할 수 있습니다 .

... if [ 146 -eq $(echo $numbers | cut -f$i -d\ ) ]; then ...

이는 -eq숫자에 대한 적절한 조건자이므로 $numbers제대로 작동하려면 내보내야 합니다.

적절한 스크립트를 작성하고 거기에서 호출하는 것이 tcsh가장 좋습니다 .

답변2

문제는 작은따옴표(전체 명령 세트를 래핑하는 데 사용됨)에 있습니다. 작은따옴표와 큰따옴표의 차이점은 큰따옴표에서는 변수와 역따옴표 명령이 해당 값으로 대체되지만 작은따옴표에서는 문자열이 있는 그대로 처리된다는 점입니다.

당신은 그것을 사용할 수 있습니다 :

bash -c "for i in 1 2; do if [ 146 = `echo $numbers | cut -f$i -d' ' ` ]; then echo 'NUM is OK '; fi done"

답변3

어때요 grep? 이것은 정적인 문제입니까, 아니면 숫자와 표준이 변경됩니까?

정적인 경우:

echo $numbers | grep -c '(^146\s)|(^\d+\s146\s)'

일치 여부에 따라 0 또는 1을 반환합니다.

테스트되지는 않았지만 첫 번째 또는 두 번째 필드와 일치해야 합니다. 더 효율적일 수 있지만 작동에 가까워야 하는 다른 모드가 있습니다.

관련 정보