Сценарий Bash проверяет, существует ли первый параметр, с помощью оператора return и переменной $? - PullRequest
1 голос
/ 04 октября 2019

Новое в скрипте bash, нужно написать функцию, чтобы проверить, является ли первый заданный параметр пустым. Вывести сообщение об ошибке, если оно пустое, в противном случае успех. Используйте оператор возврата и переменную $? Например, вывод должен выглядеть следующим образом: ./test.sh -> Script failed;./test.sh hallo -> Script OK. Спасибо!

Это то, что у меня сейчас есть:

check_parameter() {
  var=$1

  if [ -z ${var} ]; then
    return 1
  else
    return 0
  fi

  if [ $?== 0 ]; then
    echo " OK. "

  else
    echo " failed. "
  fi
}
check_parameter $1

Кажется, ìf [ -z $var ] или ìf [ -z ${var} ] не работает.

Ответы [ 4 ]

4 голосов
/ 04 октября 2019

Обратите внимание, что переменная может быть определена, но иметь пустое значение;то есть вы можете различать check_parameter и check_parameter "".

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

check_parameter () {
    : ${1?Parameter required}
}

или

check_parameter () {
    : ${1:?Non-empty parameter required}
}

В обоих случаях вызов check_parameter будет иметь статус выхода 1 и отображать данное сообщение об ошибке. Только во втором случае произойдет сбой check_parameter "" и отобразится сообщение об ошибке.

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

2 голосов
/ 04 октября 2019

Вам нужно отделить функцию. Попробуйте это.

function check_parameter() {
  var=$1

  if [ -z ${var} ]; then
    return 1
  else
    return 0
  fi
}

function scriptStatus(){
      if [ $? == 0 ]; then
          echo "Script OK. "
      else
          echo "Script failed. "
      fi
}

check_parameter $1
scriptStatus
1 голос
/ 05 октября 2019

Возможно, ваш инструктор на самом деле ищет

check_parameter() {
  if ! [ -z "$1" ]; then
    echo "$0: Script OK" >&2
    return 0
  else
    rc=$?
    echo "$0: Script failed" >&2
    return "$rc"
  fi
}

if сам по себе уже изучает $? за кадром;но это заботится о сохранении точного кода ошибки - [ -z ... ] потерпел неудачу с 1, или 2, или 255? - и передать его обратно вызывающей стороне в случае, если точный код ошибки имеет для них значение.

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

1 голос
/ 04 октября 2019

Я думаю, что он ищет что-то вроде этого:

check_parameter() {
  test -z "${1}"
  if [ $? == 0 ]; then
    echo 'Script Failed'
    return 1
  fi
  echo 'Script OK'
  return 0
}

Это может быть менее сложно, но с требованием

Используйте оператор возврата ипеременная $?

кажется, что необходимо test делать отдельно от проверки $?.

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