고려하다:
#!/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 ];
값이 없으므로 a
ksh는 대체를 수행하고 실행을 시도합니다.
if [ -gt 0 ];
명령 [
(예, 별칭이 붙은 명령 ) 은 왼쪽 피연산자가 없는 연산자를 test
이해하지 못하며 두 번째 오류 메시지가 나타납니다.‑gt
명령 [
이 0이 아닌 상태로 종료된 다음 명령문 이 블록 if
을 실행하고 else
"모든 것이 정상입니다" 메시지가 표시됩니다.
그렇기 때문에 단일 괄호 안에 모든 변수를 인용하는 것이 중요합니다.[ ... ]
if [ "$a" -gt 0 ];
더 일반적으로, 따옴표를 생략해야 하는 시기를 명시적으로 알지 않는 한 변수는 항상 따옴표로 묶입니다. 당신은 또한 볼 수 있습니다bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험