Напишите условие If как функцию - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь записать условие If как функцию, и я не уверен, возможно ли это вообще.

Следующий случай:

File1

if_exit()
{
  if $1; then
      echo "$2"
      exit 1
  fi
}

File2

source File1

SUUSER=$(whoami)
if_exit "[ $SUUSER != 'root' ]" "Please run the script as root"

Пояснение: Я хочу написать функцию, которая включает в себя условные обозначения (короткий пример используется здесь). Затем я хочу вызвать эту функцию с разными вещами, как упомянуто выше в примере кода или:

if_exit "[ $(lsb_release -is) != 'Debian' ] && [ $(lsb_release -cs) != 'stretch' ]" "The script only works with Stretch"

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Я бы сделал рефакторинг, чтобы вам не приходилось использовать кавычки вокруг аргументов.

if_exit()
{
    local message=$1
    shift
    if "$@"; then
        echo "$0: $message" >&2
        exit 1
    fi
}

# Tangentially, don't use upper case for private variables
Suuser=$(whoami)
if_exit "Please run the script as root" [ "$Suuser" != 'root' ]

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

0 голосов
/ 13 января 2019

Если у вас есть только небольшое количество чеков, вы можете использовать [[$ SUUSER! = 'Root']] && {echo "Пожалуйста, запустите скрипт от имени root"; эхо-выход 1; }

Когда у вас много проверок, я бы использовал функцию die(), как писал @erik_dannenberg.

не по теме: вы должны писать свои собственные переменные оболочки в нижнем регистре, например ${su_user}.

Одной из причин предложенной вами функции является возможность показать, какой тест не пройден (сравните "${su_user}" с root). Когда вы хотите это, сделайте такую ​​функцию, как checkroot(). Если вы хотите поддерживать всех обычных специальных символов, вы возьмете на себя много обязанностей.
Я пробовал что-то с поддержкой синтаксиса [ ... ]. Вы видите, что не так с этим «решением»?

if_exit() { # incorrect function
   # skip first '['
   shift
   # split line around ]
   IFS="]" read -r testparams errormessage <<< "${@}"
   if [ ${testparams} ] ; then
      echo "Test [ ${testparams% } ] failed: ${errormessage# }"
      # exit 1
   fi
}

if_exit [ -f non_existing_file ] "file not existing"
su_user="root"
if_exit [ "${su_user}" \!= root ] "Please run the script as root"
echo "Another test with wrong user"
su_user="aeris"
if_exit [ "${su_user}" \!= root ] "Please run the script as root"

Хорошо выглядит, кроме восклицательного знака?
Сбой произойдет, когда su_user будет пустым или имеет пробелы (su_user="I dont want to be tested").

Вы можете обойти эту проблему в функции if_exit(), но продолжите встречать новые проблемы (например, пробелы в имени файла).
Вы можете найти исходный код test.c, но вам следует отказаться от своих хороших намерений и выбрать другое решение (die() или compare_strings()).

0 голосов
/ 12 января 2019

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

function die() {
    echo "$1"
    exit 1
}

[ "$SUUSER" != 'root' ] && die "Please run the script as root"

[ "$(lsb_release -is)" != 'Debian' && "$(lsb_release -cs)" != 'stretch' ] && die "The script only works with Stretch"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...