ksh 스크립트의 예기치 않은 조건부 결과

ksh 스크립트의 예기치 않은 조건부 결과

아래 코드는 작동하지 않습니다.

나는 모든 줄을 설명했습니다.

#!/bin/ksh
cat example.txt | while read LINE                 # reading line from file
do
    var=$LINE                                     # assigning line to variable
    echo $var                                     # printing the line
    H_OR_T="${var:0:6}"                           # taking substring from the line 
    echo $H_OR_T                                  # printing the substring

지금까지 코드는 잘 작동하고 있습니다.

H_OR_T 변수에 하드코딩된 값(예: M$9001, 아래 조건 참조)이 있는 경우 루프에 들어가야 합니다. 하지만 여기서는 산술 오류가 발생합니다.

    if [[ $H_OR_T = "M$9001" ] || [ $H_OR_T = "M$9002" ]]; 
       then
       echo "************** MOVING HEADER OR TRAILER RECORD TO DOMESTIC FILE ************"
       awk '{print $0}' example.txt > domestic.txt
    else
       echo "**************** MOVING RECORD TO LOGGER FILE **********************"
       awk '{print $0}' example.txt > logger.txt
    fi
done

답변1

ksh 전문가는 아니지만 코드에 두 가지 문제가 있다고 생각합니다.

첫 번째 문제: 작은따옴표를 사용해야 합니다 M$9001. 그렇지 않으면 쉘이 확장을 시도합니다 $9001.

[ ]두 번째 문제: 내부에 중첩되어 있지 않습니다 [ ]. [[ ]]하나 또는 둘 다를 사용하십시오 [ ].

$H_OR_T흥미로운 내용으로 확장되는 경우에도 인용해야 합니다 .

수정되었을 수 있는 코드는 다음과 같습니다.

if [[ "$H_OR_T" = 'M$9001' || "$H_OR_T" = 'M$9002' ]];

또는 POSIX 규격을 준수하고 이식성이 더 뛰어납니다.

if [ "$H_OR_T" = 'M$9001' ] || [ "$H_OR_T" = 'M$9002' ];

[ ]와 사이에는 미묘한 차이가 있습니다 [[ ]]. ksh 문서에는 이 주제에 대한 내용이 약간 부족합니다. 내가 찾은 최고의 것은 다음과 같습니다.http://www.kornshell.com/doc/faq.html질문 10.

Q10. [...]그와 그의 차이점은 무엇인가요 [[...]]?

A10.은 [[...]]쉘 구문의 일부로 처리되며 [...]다른 명령처럼 처리됩니다. 연산자와 피연산자는 확장이 수행된 후가 아니라 명령을 읽을 때 감지됩니다. 쉘은 내부적으로 경로 이름을 토큰화하거나 생성하지 않습니다 [[...]]. 이를 통해 문자열 일치 목적으로 패턴을 지정할 수 있습니다.

답변2

정확한 값과 비교하는 경우 M$9001에 작은따옴표를 사용하세요.

if [[ "$H_OR_T" = 'M$9001' ]]; then
  ...
fi

답변3

이 스크립트에는 더 많은 문제가 있습니다. 쓸모없는 사용이 cat한 예입니다. 스크립트의 첫 번째 부분을 취하면 다음과 같이 작성할 수 있습니다.

while read -r line; do echo "$line"; done < example.txt

if.. else참여해서 무슨 소용이 있나요 ?awk {print $0}'

if [[ "$H_OR_T" == 'M$9001' ]]; then
 ....
 ....
fi

이 경우 "M$9001"은 문자 그대로 사용됩니다.

관련 정보