스크립트에서 "=: 찾을 수 없음" 오류가 발생함

스크립트에서 "=: 찾을 수 없음" 오류가 발생함

고려하다:

#!/bin/ksh

db2 connect to MKTETLPS user ....... using ........

db2 "select count(*)  from etl.IDM_COLLAPSE_ORG_DEE c where c.IDM_PROCESS_STEP = 'I' and priority in ( '1','2','3','4','5') and c.update_ts < (current timestamp - 60 minutes) with ur"  > l.txt

$a = /is115/idm/dsproj/scripts/l.txt

        if [ $a -gt 0 ];
      then
        db2  "update etl.idm_collapse_org_dee
             set idm_process_step = NULL where priority in (
'1','2','3','4','5')
             and idm_process_step ='I'"
      else
          echo "All is well"
fi

위 스크립트를 실행 중인데 다음 오류가 발생합니다. 어떻게 해결할 수 있나요?

./CORCleanup1.sh[8]: =:  not found.
./CORCleanup1.sh[10]: test: 0403-004 Specify a parameter with this command.
All is well
DB20000I  The SQL command completed successfully.
DB20000I  The TERMINATE command completed successfully.

db2 connect reset


db2 terminate
exit

답변1

변수 할당에는 $및 주변 공백이 포함되어서는 안 됩니다 =. 나는 또한 그 과제를 이중 인용할 것입니다. 따라서 변수 할당은 다음과 같아야 합니다.

a="/is115/idm/dsproj/scripts/l.txt"

스크립트를 자세히 읽어보면 파일 경로 자체가 아닌 1.txt파일 내용을 저장하려는 것으로 보입니다 . $a이를 위해 다음과 같이 작업을 사용할 수 있습니다.

read -r a < /is115/idm/dsproj/scripts/l.txt

( read -r파일의 첫 번째 줄을 읽고 선행 공백과 탭을 제거하고(기본값으로 가정 $IFS) 제공된 변수에 저장합니다)


$a명령문 에서 변수를 큰따옴표로 지정할 수도 있습니다 if.

if [ "$a" -gt 0 ];

당신은 또한 사용할 수 있습니다https://www.shellcheck.net/스크립트의 구문을 확인하세요.

답변2

이것이 바로 이 오류가 표시되는 이유입니다.

$a = /is115/idm/dsproj/scripts/l.txt

코드의 이 시점에서는 변수가 a아직 설정되지 않았습니다. ksh는 변수를 빈 문자열로 대체하여 다음과 같은 결과를 얻습니다.

 = /is115/idm/dsproj/scripts/l.txt

그런 다음 ksh는 해당 행을 실행하려고 시도하고, 명령을 찾으려고 시도하고 =, 찾지 못하고, 표시되는 첫 번째 오류를 생성합니다.

@Thomas가 지적했듯이 변수 할당 구문은 다음과 같습니다.

varname=value

$왼쪽에는 아무것도 없고 그 주위에는 공백도 없습니다 =.https://www.shellcheck.net/이러한 오류는 지적될 것입니다.

그럼 거기 있어요

    if [ $a -gt 0 ];

값이 없으므로 aksh는 대체를 수행하고 실행을 시도합니다.

    if [  -gt 0 ];

명령 [(예, 별칭이 붙은 명령 ) 은 왼쪽 피연산자가 없는 연산자를 test이해하지 못하며 두 번째 오류 메시지가 나타납니다.‑gt

명령 [이 0이 아닌 상태로 종료된 다음 명령문 이 블록 if을 실행하고 else"모든 것이 정상입니다" 메시지가 표시됩니다.

그렇기 때문에 단일 괄호 안에 모든 변수를 인용하는 것이 중요합니다.[ ... ]

    if [ "$a" -gt 0 ];

더 일반적으로, 따옴표를 생략해야 하는 시기를 명시적으로 알지 않는 한 변수는 항상 따옴표로 묶입니다. 당신은 또한 볼 수 있습니다bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험

관련 정보