I am trying to make a Bash script where the user will be able to copy a file, and see if it was successfully done or not. But every time the copy is done, properly or not, the second output "copy was not done" is shown. Any idea how to solve this?
if [ `cp -i $files $destination` ];then
echo "Copy successful."
else
echo "Copy was not done"
fi
What you want is
if cp -i "$file" "$destination"; then #...
You version:
if [ `cp -i $files $destination` ];then #..
will always execute the else
branch.
The if statement in the shell takes a command.
If that command succeeds (returns 0
, which gets assigned into $?
), then the condition succeeds.
If you do if [ ... ]; then
, then it's the same as
if test ... ; then
because [ ]
is syntactic sugar for the test command/builtin.
In your case, you're passing the result of the stdout* of the cp
operation as an argument to test
The stdout of a cp
operation will be empty (cp
generally only outputs errors and those go to stderr). A test
invocation with an empty argument list is an error. The error results in a nonzero exit status and thus you always get the else
branch.
*the $()
process substitution or the backtick process substitution slurp the stdout of the command they run