명령문이 조건으로 시작하지 않는지 확인하는 방법은 무엇입니까?

명령문이 조건으로 시작하지 않는지 확인하는 방법은 무엇입니까?

아래와 같이 상황을 확인하고 싶습니다. 줄은 # 다음 기호로 시작 하면 안 됩니다 .

if[ ! ["$Line" == "#*"] ]; then

그러나 이것은 작동하지 않습니다.

답변1

코드 조각에는 많은 문제가 있지만 기본적으로 구문은 [![...]]유효하지 않습니다. bash(및 기타 많은 셸)에서는 [[다른 문자로 분할할 수 없는 단일 명령입니다.

대신 항등 연산자를 부정할 수 있습니다.

if [[ "$LINE" != \#* ]]; then echo yes; fi

또한 괄호 주변의 공간을 주의 깊게 살펴보세요.

답변2

변수에 문자열이 있고 문자로 시작하지 않는 경우 line해당 문자열을 출력하려고 한다고 가정합니다 . 아래 예시에서는 조건이 만족되지 않는 경우에도 출력해 드렸습니다.yes#no

case $line in
    "#"*) echo no
esac

case문은 변수를 사용하고 임의 개수의 (와일드카드) 패턴을 사용하여 변수 값과 일치하는 패턴에 대한 코드를 실행합니다. 이 경우 패턴 "#"*( #주석을 도입하는 것으로 보이지 않도록 따옴표로 묶어야 함)을 일치시키려고 시도하고 일치하면 echo명령문을 실행합니다.

더 많은 패턴이 있는 경우 마지막 패턴을 제외한 모든 코드는 로 끝나야 합니다 ;;.

case $line in
    "#"*) echo no ;;
    *)    echo yes
esac

...그리고 패턴의 코드는 비어 있을 수 있습니다.

case $line in
    "#"*) ;;
    *)    echo yes
esac

쉘은 또한 bash연산자를 통해 glob과 패턴 일치를 수행합니다.[[ ... ]]==

if [[ $line != "#"* ]]; then
    echo yes
else
    echo no
fi

에서는 bash정규식을 사용하여 =~다음의 연산자와 일치시킬 수도 있습니다 [[ ... ]].

if ! [[ $line =~ ^# ]]; then
    echo yes
else
    echo no
fi

또는

if [[ $line =~ ^[^#] ]]; then
    echo yes
else
    echo no
fi

파일을 한 줄씩 구문 분석하려는 경우 셸은 해당 작업에 적합한 도구가 아닙니다. 대신 다음과 같은 것을 사용할 수 있습니다 awk.

awk '/^[^#]/ { print yes }' <inputfile

관련된:

관련 정보