Как вернуть код выхода? Ошибка: return: Чтение: требуется числовой аргумент

Вот упрощенная версия моего скрипта. Мой вопрос: как мне вернуть код выхода из apt-get в этом случае?

 #!/bin/bash install_auto() { apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then return $(sudo apt-get install --assume-yes $@) fi return 1 } echo "installing $@" install_auto "$@" echo $? echo "finished" exit 0 

Выход:

 ./install_test.sh: line 5: return: Reading: numeric argument required 

Обновление: я придумал что-то, что работает:

 return $(sudo apt-get install --assume-yes "$@" >/dev/null 2>&1; echo $?) 

Это хороший подход?

  • Передача переменной в скрипт bash, который использует «EOF» и рассматривает переменную буква
  • как использовать shell-скрипт с snmpwalk с OID, чтобы иметь идентификатор vlan, имя vlan, порт принадлежит vlans в таблице Excel
  • Как определить интерпретатор команд из сценария оболочки?
  • Разрешить пользователям запускать только определенные двоичные файлы с правами root / привилегиями
  • Определите, когда скрипт python ожидает ввода вручную
  • Как отображать вывод команды во время ее разбора?
  • 'while read line do' cause: "синтаксическая ошибка около неожиданного токена` done '"в скрипте Linux bash
  • Как вставить строку в массив по-разному
  • 2 Solutions collect form web for “Как вернуть код выхода? Ошибка: return: Чтение: требуется числовой аргумент”

    return() Bash return() может возвращать только числовые аргументы. В любом случае, по умолчанию, он вернет статус завершения последнего запуска команды. Итак, все, что вам действительно нужно, это:

     #!/usr/bin/env bash install_auto() { apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then sudo apt-get install --assume-yes $@ fi } 

    Вам не нужно явно указывать возвращаемое значение, поскольку по умолчанию функция возвращает $? , Однако это не сработает, если первая команда apt не удалась, и вы не вошли в цикл if . Чтобы сделать его более надежным, используйте это:

     #!/usr/bin/env bash install_auto() { apt-get -h > /dev/null 2>&1 ret=$? if [ $ret -eq 0 ] ; then ## If this is executed, the else is ignored and $? will be ## returned. Here, $?will be the exit status of this command sudo apt-get install --assume-yes $@ else ## Else, return the exit value of the first apt-get return $ret fi } 

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

     function foo() { run_a_command arg1 arg2 argN ## Save the command's exit status into a variable return_value= $? [the rest of the function goes here] ## return the variable return $return_value } 

    EDIT: На самом деле, как отметил @gniourf_gniourf в комментариях, вы могли бы значительно упростить все это, используя && :

     install_auto() { apt-get -h > /dev/null 2>&1 && sudo apt-get install --assume-yes $@ } 

    Возвращаемое значение этой функции будет одним из следующих:

    1. Если apt-get -h не удалось, он вернет код выхода
    2. Если apt-get -h преуспел, он вернет код выхода sudo apt-get install .

    Для полноты, вот моя фактическая функция с некоторыми изменениями, предложенными @terdon и @gniourf_gniourf:

     install_auto() { if [ ! $# -gt 0 ] ; then echo "usage: $0 package_name [package_name ...]" fi apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then if [ -f "$@" ] || [[ "$@" =~ '/' ]] ; then sudo gdebi -n "$@" return $? else sudo apt-get install --assume-yes "$@" return $? fi fi zypper help > /dev/null 2>&1 if [ $? -eq 0 ] ; then sudo zypper --non-interactive --no-gpg-checks --quiet install --auto-agree-with-licenses "$@" return $? fi #may check other package managers in the future echo "ERROR: package manager not found" return 255 } 

    Я ценю любые дальнейшие предложения.

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