내 스크립트에서 임시 변수를 비교하고 있는데 비어 있으면 임시 변수를 업데이트하고 싶습니다. 그러나 아래 스크립트는 작동하지 않습니다.
스크립트:
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
및를 사용하여 행을 선택할 수 있습니다.tail
sed
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')