숫자 목록의 첫 번째 또는 두 번째 필드가 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을 반환합니다.
테스트되지는 않았지만 첫 번째 또는 두 번째 필드와 일치해야 합니다. 더 효율적일 수 있지만 작동에 가까워야 하는 다른 모드가 있습니다.