考虑:
#!/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 中引用变量的安全隐患