Как я могу запустить другую команду в соответствии с результатом последней команды? - PullRequest
3 голосов
/ 05 декабря 2011

Например, есть 4 файла (A, B, C, D), которые я пытался загрузить с помощью cURL, но иногда это не удавалось.Мой сценарий выглядит так:

for f in `ls`
do
  curl -T $f ftp.server.com
done

A, B, C были успешно загружены, в то время как D ушел с какими-то ошибками.Я хочу удалить A, B, C и оставить в каталоге только D.

Ответы [ 2 ]

7 голосов
/ 05 декабря 2011

Перво-наперво, вы кодировали ошибку в своем маленьком скрипте:

for files in `ls`

Это должно выглядеть так:

for files in *

Разница в том, что ls подход выиграл '• правильно обрабатывать файлы с пробелами в их именах:

$ ls -l
total 8
-rw-r--r-- 1 sarnold sarnold   15 2011-11-23 01:25 bad file
drwxr-xr-x 2 sarnold sarnold 4096 2011-11-21 03:07 blubber
$ for f in `ls` ; do echo === $f === ; done
=== bad ===
=== file ===
=== blubber ===
$ for f in * ; do echo === $f === ; done
=== bad file ===
=== blubber ===
$ 

Теперь перейдем к проблеме загрузки и удаления:

for f in * ; do curl -T $f ftp.example.com && rm $f ; done

&& - оператор короткого замыкания;она выполнит вторую команду только в том случае, если первая команда вернет значение выхода 0 (что обычно означает «успешно» в возвращаемых значениях процесса - да, немного назад).Вы также можете когда-нибудь найти оператор || полезным для выполнения программ в случае сбоя.И, возможно, самое удивительное, вы можете использовать их обе в одной команде, чтобы сделать что-то в случае успеха или неудачи в зависимости от ситуации:

$ true && echo success || echo failure
success
$ false && echo success || echo failure
failure
$ 
3 голосов
/ 05 декабря 2011

$? относится к коду возврата . Если предположить, что «0» означает успешную загрузку curl, то вам нужно что-то вроде этого:

for files in `ls`
do
    curl -T $f ftp.server.com
    if [[ $? -eq 0 ]]; then
      rm $f
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...