쉘 스크립트에서 비교할 때 특수 문자를 무시합니다.

쉘 스크립트에서 비교할 때 특수 문자를 무시합니다.

내 스크립트에서 임시 변수를 비교하고 있는데 비어 있으면 임시 변수를 업데이트하고 싶습니다. 그러나 아래 스크립트는 작동하지 않습니다.

스크립트:

temp=`head -5 $filename1 | tail -1`
if [ "$temp" == " " ]
then
    temp=`head -6 $filename1 | tail -1`
    echo "Blank - Updated temp value"
else
    echo "$temp not blank"
fi

문제 해결 후 od명령을 사용할 때 이것을 발견했습니다. 임시변수를 확인해 보니 공백이 있다는 것을 고려하지 않아서 특수문자가 들어있습니다.

echo $temp | od -c
0000000  \r  \n
0000002

위의 특수 문자를 무시하는 방법을 알아낼 수 있습니까?

답변1

가장 먼저 해야 할 일은 다음과 같습니다.

if [ "$temp" == " " ]

비교 연산자는 실제로 =가 아니라 입니다 ==. 후자는 일부 쉘에서 작동하지만 표준은 아닙니다. 또한 변수를 빈 문자열과 비교하는 대신 변수를 단일 공백이 포함된 문자열(파일에 포함될 수도 있고 포함되지 않을 수도 있음)과 비교하게 됩니다.

파일에 추가 공백이 포함될 수 있는 경우 sed모든 공백을 사용하거나 제거하는 것이 좋습니다 tr. 그런 다음 이를 사용하여 [ -z "$temp" ]비어 있는지 테스트 할 수 있습니다 . 그래서:

temp=$(head -5 $filename | tail -1 | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

head및를 사용하여 행을 선택할 수 있습니다.tailsed

temp=$(sed -n '5p' | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

( 5p"라인 5에서 (p)이 라인을 인쇄"를 의미하며 -n모든 라인을 인쇄하는 기본 작업을 비활성화합니다.)


awk실제로 테스트하는 대신 다섯 번째 줄에 내용이 있는지 여부에 따라 파일을 반복하여 다섯 번째 또는 여섯 번째 줄을 가져오는 스크립트를 갖고 싶습니다 .

temp=$(tr -d ' \t\r' < $filename1 | awk '(NR==5 && $0) || NR==6 {print; exit}' )

( NR==5현재 줄(레코드) 번호를 테스트하고 $0줄의 내용으로 확장되며 줄이 비어 있지 않으면 "true" &&이고 ||일반적인 경우입니다.그리고그리고또는운영)

답변2

sed모든 공백 문자를 사용 하고 제거합니다...temp=$(head -5 $filename1 | tail -1 | sed -r 's/\s+//g')

관련 정보