bash -e выходит, если let или expr оценивается до 0

У меня есть скрипт bash, который устанавливает -e, поэтому скрипт выйдет из любого статуса выхода! = 0.

Я пытаюсь выполнить некоторую базовую арифметику оболочки, назначенную для переменных, а иногда выражение равно 0, что приводит к тому, что статус выхода команды let или expr будет «1».

Вот пример:

#!/bin/bash -ex echo "Test 1" Z=`expr 1 - 1` || true echo "Z will print" let "A=4 - 4" echo "A WILL NEVER PRINT $A" Y=`expr 1 - 1` echo "Y WILL NEVER PRINT $Y" X=$(expr 2 - 2) echo "X WILL NEVER PRINT $X" 

Выход:

 $ ./test_error.sh + echo 'Test 1' Test 1 ++ expr 1 - 1 + Z=0 + true + echo 'Z will print' Z will print + let 'A=4 - 4' 

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

 A=`expr $C - $D` || true 

Но это кажется взломанным.

  • запросить ошибку, если нет аргумента argv ожидать сценарий
  • передача команд sftp в sftp соединение в файле
  • в то время как цикл чтения
  • Какова цель запуска сценария?
  • Открыть URL-адрес и заполнить форму автоматически
  • В чем разница между filename = $ {1: - / etc / hosts} и filename = / etc / hosts?
  • Ожидайте сценарий для копирования файла
  • Проверьте, существует ли файл на удаленном компьютере с пробелами в имени файла и / или пути
  • 3 Solutions collect form web for “bash -e выходит, если let или expr оценивается до 0”

    Не используйте expr для арифметики. Это уже давно устарело: оболочки теперь имеют арифметику, с конструкцией $((…)) (POSIX) или с let builtin (ksh / bash / zsh) или конструкцией ((…)) (ksh / bash / ЗШ).

    let и ((…)) return 1 (код состояния сбоя), если последнее оцениваемое выражение равно 0. Чтобы избежать этого, чтобы ваш скрипт вышел из set -e , уделите последнее выражение не возвратом 0, например:

     let "a = 2 - 2" 1 ((a = 2 - 2, 1)) 

    В качестве альтернативы используйте || true || true идиома:

     ((a = 2 - 2)) || true 

    В качестве альтернативы, сделайте свою арифметику внутри $((…)) и ваших заданий вне. Назначение возвращает статус последней подстановки команды в значении или 0, если нет подстановки команды, поэтому вы в безопасности. Это имеет дополнительное преимущество для работы в любой оболочке POSIX (например, тире).

     a=$((2 - 2)) 

    Используйте $(( $C - $D )) вместо вашего арифметического. Это более эффективно.

    У меня была та же проблема . ТЛ; др:

    Если последний ARG [of let] имеет значение 0, пусть возвращает 1; пусть возвращает 0 в противном случае.

    Interesting Posts

    Удобнее ли подключаться к SSH с помощью пароля, потому что SSH-ключи необходимо хранить на каждом компьютере

    bash молча выполняет функцию return on (re) объявляет глобальный ассоциативный массив только для чтения

    Debian ARM на ошибке сервера Chroot Mumble

    Тюремные DNS-запросы к отдельной группе с iptables не работают

    Установка времени вручную в Lubuntu не обновляет аппаратные часы

    Установщик Oracle Server не позволяет ввести значение в поле

    Не удается запустить Oracle после установки

    Простое использование суффикса адресной строки '/ M'?

    Создание пользовательского расхождения

    дедупликация строк в большом файле

    Есть ли файл, который я могу редактировать, чтобы изменить привязки клавиш Просвещения 19?

    Почему, когда я ssh на один сервер, он показывает bash, а другой имеет мое имя пользователя?

    utf-8 в консоли

    iMac не будет отключен нормально и останется на круге загрузки навсегда

    Истекает срок действия пароля для Linux и cron

    Linux и Unix - лучшая ОС в мире.