sed 명령의 출력인 문자열을 저장하는 변수가 있습니다. 해당 문자열 값이 다른 2개의 문자열 중 하나와 일치하는 경우에만 일련의 명령을 실행하고 싶습니다.
아래 코드를 사용했습니다.
#! /bin/ksh
request=”Request”
fault=”Fault”
while read lines; do
category=`echo $lines|sed -n -e 's/.*Summary: Value//p'| awk '{print $1}'`
if [ ! -z "$category" ]
then
if($category = $request)
then
echo $category
fi
fi
done<content.txt
하지만 이로 인해 오류가 발생했습니다.
sample.sh: Request: not found
Request
변수 범주에는 값 또는 값이 있습니다 .Order
누군가 오류나 해결 방법을 지적할 수 있나요?
if 내부의 if가 제거되고 echo $category
정확한 문자열 값이 인쇄됩니다.
답변1
답변2
if
다른 사람들은 귀하의 진술에서 문법적 오류를 지적했습니다 .
”
또한 일반적인 큰따옴표 대신 큰따옴표 인쇄를 사용하는 것으로 보인다는 사실에 대해서도 언급하고 싶습니다 "
. 또한 sed
이 명령 대체의 출력을 별도의 변수에 저장할 필요가 없습니다 . 대신 awk
출력에서 직접 읽으십시오.
#!/bin/ksh
sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
case $category in
Request|Fault)
printf '%s\n' "$category"
;;
Breakfast)
echo 'Yum'
;;
*)
printf 'Unknown category: %s\n' "$category"
esac
done
또는 - 문을 사용하는 것이 더 편한 if
경우
#!/bin/ksh
sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
if [ "$category" = 'Request' ] || [ "$category" = 'Fault' ]; then
printf '%s\n' "$category"
elif [ "$category" = 'Breakfast' ]; then
echo 'Yum'
else
printf 'Unknown category: %s\n' "$category"
fi
done
문자열이 비어 있는지 여부를 테스트할 필요가 없습니다. 빈 문자열을 다른 문자열과 비교하는 한 문제가 없습니다.항상 변수 확장을 인용하세요..
또는 스크립트가 다음 작업만 수행하는 경우:
#!/bin/ksh
sed -n 's/.*Summary: Value//p' <content.txt | awk '
$1 == "Request" || $1 == "Fault" { print $1; next }
$1 == "Breakfast" { print "Yum"; next }
{ printf("Unknown category: %s\n", $1) }
관련된:
답변3
[
대신 if 조건을 사용해야 합니다 .(
노력하다:
if [ "$category" = "$request" ]
()
명령을 실행하고 종료 코드를 확인하는 데 사용됩니다.[]
표현식을 확인하는 데 사용됩니다.
UNIX 문자가 아닌 MS-word에서 스크립트를 복사했으면 좋겠습니다.”
request=”Request”
fault=”Fault”
이것을 편집하여
request="Request"
fault="Fault"
답변4
다른 모든 답변에서 말하는 것 외에도
awk
매우 강력한 프로그램입니다. 이를 다른 텍스트 서식 지정 명령과 결합할 필요가 거의 없습니다. 예를 들어,sed -n -e 's/.* 요약: 값 //p' awk '{print $1}'
로 변환될 수 있다awk '{ if (sub(/.*Summary: Value/, "")) $1 인쇄 }'
- 특별한 이유가 없는 한 항상 쉘 변수(예:
"$lines"
,"$category"
및 )를 인용해야 합니다."$request"
틀림없이당신은 당신이 무엇을하고 있는지 알고 있습니다. - ~처럼코살로난다는 지적했다.,
쉘 루프를 사용하여 텍스트를 처리하는 것은 나쁜 습관으로 간주됩니다.. 위에서 말했듯
awk
이 매우 강력한 프로그램입니다. 귀하의 스크립트가 파일을 한 번에 한 줄씩 읽고awk
각 줄에 대해 한 번씩 호출한다는 것을 이해한다고 가정합니다. 명시적으로 언급하지 않고 Kusalananda는 전체 파일을 한 번sed
실행( 및 )하는 예제 솔루션을 제공합니다. 마지막 솔루션은 모든 논리를 셸 코드가 아닌 스크립트에 넣습니다. 귀하의 질문에서 알 수 있듯이, 현재 하고 있는 작업이 문자열을 인쇄하는 것뿐이라면 이것이 아마도 최선의 접근 방식일 것입니다. 그러나 입력을 기반으로 다른 명령을 실행해야 하는 경우에도 사용할 수 있습니다 . 작업의 복잡성은 어떤 방법이 더 나은지 결정하는 요소입니다.awk
sed
awk
system()
awk