아래 코드는 작동하지 않습니다.
나는 모든 줄을 설명했습니다.
#!/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"은 문자 그대로 사용됩니다.