избегайте выполнения других строк, если мой вызов curl не будет выполнен по какой-либо причине - PullRequest
0 голосов
/ 22 января 2020

В моем скрипте есть строки ниже, и на данный момент он работает нормально:

URL="$(hostname -f | grep -q "\.dev\." && echo "$URL_1" || echo "$URL_2")"
FILE="$(hostname -f | grep -q "\.dev\." && echo "file.init.proc" || echo "file.init.test")"
curl --fail -o "$TEMPFILE" "$URL" && if ! grep -q "$TEST_IPD" "$TEMPFILE"; then echo "ipaddress missing in the file" || return 2; else mv -- "$TEMPFILE" "$CONFIG_DIR/$FILE"; rm -f -- "$TEMPFILE"; fi
"line 4- something here"
"line 5- something here"

Но ранее в моей строке URL и FILE была некоторая проблема, из-за которой мой curl строка не выполнена, и по какой-то причине все еще строки 4 и 5 были выполнены, и я не хочу, чтобы эти строки выполнялись.

Скажем по какой-то причине, если я не могу извлечь переменную URL или FILE, то, если моя строка сгиба не получается, я не хочу, чтобы строка 4 и строка 5 выполнялись вообще. По сути, если по какой-либо причине моя строка скручивания не работает, я не хочу, чтобы строка 4 или строка 5 выполнялась вообще.

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Давайте немного исправим это.

if hostname -f | grep -qF '.dev.'; then
    URL=$URL_1
    FILE=file.init.proc
else
    URL=$URL_2
    FILE=file.init.test
fi

if curl --fail -o "$TEMPFILE" "$URL"; then
    if ! grep -q "$TEST_IPD" "$TEMPFILE"; then
        echo "ipaddress missing in the file" >&2
        return 2
    else
        mv -- "$TEMPFILE" "$CONFIG_DIR/$FILE" && rm -f -- "$TEMPFILE"
    fi
else
    "line 4- something here"
    "line 5- something here"
fi

--fail просто вызывает curl для выхода, если что-то идет не так; это не влияет на оболочку, которую выполнил curl. Старайтесь избегать использования && и || для чего-либо, кроме коротких команд, и никогда не используйте ... && ... || ... вместо правильного if оператора.

0 голосов
/ 22 января 2020

Есть несколько способов остановиться или продолжить после неудачной команды.
Вот несколько примеров:


Включите команду, как будто условие возможно, лучший способ

$ if echo foo; then echo bar; fi  
foo  
bar    

Проверьте код выхода , чтобы узнать результат данной команды (стандарт - вернуть 0 код выхода в случае успеха и код переменной от 1 до 255 в случае ошибки), но, как сказал @Charles Duffy,

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

Подробнее здесь

$ echo foo  
$ echo $?  
0  

Так что вы можете сделать что-то вроде:

$ echo foo  
foo
$ if [[ $? == 0 ]]; then echo bar; fi  
bar

Использование код выхода и арифметический режим c
Проверка на успех

$ if ! (($?)); then echo bar; fi  
bar  

Проверка на сбой

$ if (($?)); then echo bar; fi   

Использование && ||

$ echo foo && echo bar || echo baz
foo  
bar

Говоря о вашем вопросе, упростите и сделайте что-то вроде этого:

if curl -o "$TEMPFILE" "$URL"; then  
  echo SUCCESS   
  echo "Here's the logic of your 4 and 5 line or whatever you want."  
else  
  echo FAIL  
  echo "Maybe you should exit with an error code, like this "  
  exit 1  
fi  

exit 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...