
아래와 같이 상황을 확인하고 싶습니다. 줄은 #
다음 기호로 시작 하면 안 됩니다 .
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
관련된: