Как вернуть код выхода? Ошибка: 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 

Выход:

  • Полоса пропускания новой строки с входного канала
  • Игнорировать глобусы, которые не соответствуют чему-либо
  • Определите, нажата ли кнопка мыши, затем вызовите скрипт или команду
  • Выполнить конкретную команду в заданной директории без cd'ing?
  • Как убить процесс после отсоединения его от bash?
  • Зачем нужна задержка после того, как ifconfig нужно до того, как сменить MAC-адрес?
  •  ./install_test.sh: line 5: return: Reading: numeric argument required 

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

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

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

  • Сохранение количества файлов в папке постоянным путем удаления старых файлов
  • Редактируйте файл с помощью скрипта, но сохраняйте теги osx
  • Переменная окружения для ip-адреса
  • Сценарий 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 - лучшая ОС в мире.