What you want is
if cp -i "$file" "$destination"; then #...
Don't forget the quotes.
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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…