Bash Script Ошибка при сборе

Я очень новичок в сценариях bash, и для моей первой попытки script я отправляю файлы в свой почтовый ящик профессора на том же сервере.

Код выглядит так:

#! /bin/bash
echo "Submit Lab$1? \c"

read choice

if [ $choice = "y" ]; then
   echo "Sending to Prof dropbox..."
   cp -r /path/to/lab$1 /path/to/dropbox
else
   echo "Submission terminated."
fi

Использование команды просто "$ submit 1" (1 - одно целое, соответствующее той лаборатории, которую я хочу отправить)

bash script добавляет введенный аргумент (одно целое число) к необходимому имени файла (директории), а затем отправляет этот каталог в мой drop dropbox с помощью cp.

Больше для обучения, чем абсолютной необходимости, я хотел создать чистую подсказку, которая поймает любые ошибки cp (например, файл не существует) и сможет вывести собственное сообщение об ошибке.

Итак, в основном, что-то вроде:

echo "Submit lab$1?"

read choice

echo "Send to Prof dropbox"
cp -rv /path/to/lab$1 /path/to/dropbox

<catch any errors from cp>

if [ cp has errors ]

   echo "Submission failed."

else if [ cp has no errors ]

   echo "Submission successful."

And so on...

Я понимаю, что могу использовать подробный режим и что cp сам печатает ошибки, но, как было сказано ранее, я делаю это с целью изучения ошибки в bash и возможности сделать чистую приглашение.

Любая помощь будет оценена.

Спасибо!


Также: У меня есть аналогичный script, который представляет лаборатории с моего ноутбука, используя scp. Предполагая, что у меня есть ответ на этот вопрос, могу ли я применить решения для scp точно так же?

EDIT: Я не хочу, чтобы ошибки cp выводились в оболочку! Наиболее распространенной ошибкой, вероятно, будет "не может быть stat blah: нет такого файла или каталога". Я хотел бы поймать эту ошибку и просто сказать: "Submission failed."

EDIT # 2: Ответ jcollado правильный, проблема с моей стороны. Не закончил вложенный if-else с помощью правильного "fi."

После исправления этого, он работал по назначению. Все еще нужно поймать выход ошибки, но я верю, что знаю, где мне нужно разобраться в этом самостоятельно, поэтому на этот вопрос мне ответил, насколько мне известно.

ОКОНЧАТЕЛЬНЫЙ РЕДАКТ: А, черт возьми, перенаправление было так просто, я подумал, что поставлю решение здесь. Если вы используете Linux, просто добавьте "2>/dev/null" (если вы не хотите, чтобы сообщения об ошибках сохранялись в любом файле) после cp, чтобы сделать "cp -r /first/path /second/path 2>/dev/null"

Ответ 1

Хотя вы можете проверить $?, вы также можете проверить статус выхода команды напрямую:

if cp -rv /path/to/lab$1 /path/to/dropbox
then echo Submission successful
fi
exit $?

Ошибки уже сообщались к стандартной ошибке с помощью cp. Показанный exit выйдет со статусом 0 (успех), если cp был успешным; в противном случае он выходит со статусом, из которого cp вышел с.

Очевидно, вы можете обернуть это в цикле, если хотите, или сделать его неинтерактивным (но любой выход завершает работу script).

Ответ 2

Чтобы проверить код возврата из предыдущей команды, вы можете использовать специальную переменную $? следующим образом:

if [ "$?" -ne "0" ]; then
  echo "Submission failed"
  exit 1
fi

echo "Submission successful."

Кроме того, если вы хотите получить чистое приглашение, вы можете повторно использовать stderr, как описано здесь.

Наконец, вы также можете использовать его в script, который использует scp, поскольку он работает независимо от используемой вами команды.

Ответ 3

echo "Submit lab$1?"

read choice

echo "Send to Prof dropbox"
cp -rv /path/to/lab$1 /path/to/dropbox &>/dev/null

[ $? -eq 0 ] && { #success, do something } || { #fail, do something }

И так далее...