Abhishek Singh
Abhishek Singh

Reputation: 33

How to print a success message after the complete execution of a script?

#! /bin/sh
  
DB_USER='aaa';
DB_PASSWD='aaa1';

DB_NAME='data';
TABLE='datalog';


mysql --local-infile=1 --user=$DB_USER --password=$DB_PASSWD $DB_NAME -e "load data local infile '/home/demo/data1.csv' into table datalog fields terminated by ',' lines terminated by '\n';" -e echo "script executed successfully " | date "+%h %e"

My aim is to print a success message after the above script executes successfully. I have written the above command to do so but it is printing the date, not the echo statement.

Upvotes: 2

Views: 1911

Answers (1)

tripleee
tripleee

Reputation: 189417

The arguments to mysql -e should be SQL commands, not shell script.

The solution is much simpler than what you are trying.

#!/bin/sh

# Terminate immediately if a command fails
set -e

# Don't put useless semicolons at the end of each assignment
# Use lower case for your private variables
db_user='aaa'
db_passwd='aaa1'

db_name='data'
table='datalog'

# Quote strings
mysql --local-infile=1 --user="$db_user" --password="$db_passwd" "$db_name" \
     -e "load data local infile '/home/demo/data1.csv' into table $table fields terminated by ',' lines terminated by '\n';"

# Just use date
# Print diagnostics to standard error, not standard output
date "+%h %e script executed successfully" >&2

The use of set -e is somewhat cumbersome, but looks like the simplest solution to your basic script. For a more complex script, maybe instead use something like

mysql -e "... stuff ..." || exit

to terminate on failure of this individual command, but allow other failures in the script. Perhaps see also What does set -e mean in a bash script?

If you want to preserve the exit code from mysql and always print a message to show what happened, probably take out the set -e and do something like

if mysql -e "... whatever ..."
then
    date "+%h %e script completed successfully" >&2
else
    rc=$?
    date "+%h %e script failed: $rc" >&2
    exit $rc
fi

As an aside, date does not read its standard input for anything, so you can't pipe echo to it. The script above simply uses only date, but here are a few different ways you could solve that.

# Merge this output with the next output
date "+%h %e" | tr '\n' ' ' >&2
echo script executed successfully >&2

or

# Use a command substitution to interpolate the output from date into
# the arguments for echo
echo "$(date "+%h %e") script executed successfully >&2

For more complex situations, maybe also look into xargs, though it's absolutely horribly overkill here.

date "+%h %e" | xargs -I {} echo script executed successfully {} >&2

If you use only date, you will need to be mindful of your use of % in any literal message; to print a literal per-cent sign from date, use %%.

As a further stylistic aside, you should avoid upper case for your private variables.

Upvotes: 3

Related Questions