Кроме синтаксических ошибок, предположительно внесенных здесь во время cut'n'paste, в этом коде нет ничего плохого, как показано в следующем эксперименте:
#!/bin/bash
rm -rf sourcepath destpath
mkdir sourcepath
mkdir destpath
touch sourcepath/xyz
touch destpath/xyz
chmod 000 destpath/xyz
if [ -d sourcepath ]
then
if [ -d destpath ]
then
cp sourcepath/xyz destpath/xyz
else
echo problem with dest
exit 1
fi
else
echo problem with source
exit 1
fi
echo Woohoo!
При запуске выдается:
cp: cannot create regular file `destpath/xyz': Permission denied
Woohoo!
, чтобы вы могли видеть, что он продолжает работать после сбоя.
Один бесценный совет: когда вы отлаживаете bash
сценариев, поставьте строку:
set -x
прямо вверх (после #!/bin/bash
, если он там есть).Это приведет к выводу каждой команды перед ее выполнением.
На самом деле я всегда корректирую свои сценарии, начиная с:
#!/bin/bash
#set -x
, поэтому я могу просто раскомментировать вторую строку для целей отладки.
Кроме того, я бы закодировал это как:
if [[ ! -d sourcepath ]] ; then
problem with source
exit 1
fi
if [[ ! -d destpath ]] ; then
problem with dest
exit 1
fi
cp <source path> <dest path>
, но это только потому, что я не люблю сложные if-then-else
конструкции.