脚本抛出错误“=:未找到”

脚本抛出错误“=:未找到”

考虑:

#!/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没有左侧操作数的运算符,并且您会收到第二条错误消息。

[命令以非零状态退出,if然后该语句执行该else块,并且您会收到“一切都很好”消息。

这就是为什么在单括号内引用所有变量很重要[ ... ]

    if [ "$a" -gt 0 ];

更一般地说,除非您明确了解何时省略引号,否则始终引用变量。也可以看看忘记在 bash/POSIX shell 中引用变量的安全隐患

相关内容