4

Consider:

#!/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 

I am running above the script and am receiving the below error. How can I fix it?

./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 
0

2 Answers 2

11

Variable assignments must not include $ and spaces around the =. I also would double quote the assignment. So the variable assignment should look like as follows.

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

From further reading the script, it looks like you rather want to store the content of the file 1.txt in $a rather than the file path itself. For that purpose you could use the assignment as follows.

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

(read -r reads the first line of the file, strips the leading and trailing spaces and tabs (assuming the default value of $IFS) and stores it in the supplied variable)


You also may want to double quote the $a variable in the if statement.

if [ "$a" -gt 0 ]; 

You can also use https://www.shellcheck.net/ to check the syntax of your script.

1
  • Or if the file was meant as a temporary, a=$( db2 "select count(*) from tbl where cond and cond etc" ) -- though slightly less basic, command substitution is a very useful tool to learn Commented Sep 2, 2018 at 1:23
3

Here's why you're seeing that error:

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

At this point in the code, the variable a is unset. ksh will substitute the variable with the empty string, resulting in:

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

Then ksh attempts to execute the line, tries to locate the command =, fails to find it, and produces the 1st error you see.

As @Thomas points out, the syntax for variable assignment is

varname=value 

with no $ on the left-hand side, and no spaces around =. https://www.shellcheck.net/ will point out these errors.

Then you have

 if [ $a -gt 0 ]; 

Since a has no value, ksh performs the substitution and tries to do

 if [ -gt 0 ]; 

The [ command (yes, it is a command, aliased to the test command) does not understand the ‑gt operator without a left-hand operand, and you get the 2nd error message.

The [ command exits with non-zero status, the if statement then executes the else block, and you get the "all is well" message.

This is why it's important to quote all variables within single brackets [ ... ]

 if [ "$a" -gt 0 ]; 

More generally, always quote variables unless you understand specifically when to omit the quotes. See also Security implications of forgetting to quote a variable in bash/POSIX shells

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.