UNIX 쉘 스크립트에서 두 문자열을 비교하는 방법은 무엇입니까? [복사]

UNIX 쉘 스크립트에서 두 문자열을 비교하는 방법은 무엇입니까? [복사]

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

간단한 대답은 다음과 같은 구문을 사용할 수 있다는 것입니다.

if [ "$category" = "$request" ]

간격이 중요합니다. 참고로, 명령 대체 및 대체를 위해 가장 가까운 방법을 사용해야 합니다(참조제1조그리고POSIX 기사):

category=`echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}'`

그래서

category=$(echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $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

다른 모든 답변에서 말하는 것 외에도

  1. awk매우 강력한 프로그램입니다. 이를 다른 텍스트 서식 지정 명령과 결합할 필요가 거의 없습니다. 예를 들어,
    sed -n -e 's/.* 요약: 값 //p' awk '{print $1}'
    로 변환될 수 있다
    awk '{ if (sub(/.*Summary: Value/, "")) $1 인쇄 }'
  2. 특별한 이유가 없는 한 항상 쉘 변수(예: "$lines", "$category"및 )를 인용해야 합니다."$request"틀림없이당신은 당신이 무엇을하고 있는지 알고 있습니다.
  3. ~처럼코살로난다는 지적했다., 쉘 루프를 사용하여 텍스트를 처리하는 것은 나쁜 습관으로 간주됩니다.. 위에서 말했듯 awk이 매우 강력한 프로그램입니다. 귀하의 스크립트가 파일을 한 번에 한 줄씩 읽고 awk각 줄에 대해 한 번씩 호출한다는 것을 이해한다고 가정합니다. 명시적으로 언급하지 않고 Kusalananda는 전체 파일을 한 번 sed실행( 및 )하는 예제 솔루션을 제공합니다. 마지막 솔루션은 모든 논리를 셸 코드가 아닌 스크립트에 넣습니다. 귀하의 질문에서 알 수 있듯이, 현재 하고 있는 작업이 문자열을 인쇄하는 것뿐이라면 이것이 아마도 최선의 접근 방식일 것입니다. 그러나 입력을 기반으로 다른 명령을 실행해야 하는 경우에도 사용할 수 있습니다 . 작업의 복잡성은 어떤 방법이 더 나은지 결정하는 요소입니다.awksedawksystem()awk

관련 정보