유닉스 스크립트 문제

유닉스 스크립트 문제

다음 코드를 사용하여 FreeBSD 시스템에서 실행되는 간단한 스크립트가 있습니다.

#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?

두 패턴 사이의 텍스트 블록을 삭제해야 합니다.

문제는 쉘에서 직접 sed 명령을 실행하면 작동하지만 스크립트를 실행하면 반환 코드가 0이라는 것입니다.

왜죠?

답변1

백틱을 제거하고 작은따옴표를 큰따옴표로 변경해야 합니다.

#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf

큰따옴표를 사용하면 변수를 확장할 수 있습니다. 백틱은 명령의 표준 출력을 실행하려고 시도합니다(이 경우에는 없음). 예를 들어, `echo hi`"hi"를 명령으로 실행하려고 시도합니다. sed교체 여부에 관계없이 오류가 없으면 항상 0을 반환합니다.

답변2

백틱은 실제로 필요하지 않습니다(아니면 제가 잘못 이해한 것일 수도 있습니다). 스크립트가 0을 반환한다는 사실도 예상됩니다. 종료 코드 0은 괜찮습니다. 편집: sed는 대체 항목이 없더라도 항상 0으로 종료됩니다. 구문에 오류가 있는 경우에만 또 다른 종료 코드가 생성됩니다.

더 흥미로운 점은 코드가 삭제되었는지 여부입니다.

귀하의 의견으로 판단하면 정규식 및/또는 이스케이프 문자에 문제가 있을 수 있습니다.

관련 정보