Как лучше всего проверить результат возврата?

Если вы можете получить доступ к серверу SSH дома, но не за его пределами, возможно, вам потребуется настроить маршрутизатор. чтобы разрешить доступ с переадресацией портов SSH. Также обратите внимание, что вы не получаете доступ к удаленному компьютеру Ubuntu по локальному (обычно 192.168.xx) IP-адресу, а по общедоступному IP-адресу маршрутизатора, который вы можете найти, просто набрав в Google "какой у меня IP", пока в домашней сети.

6
03.04.2019, 14:56
2 ответа

Здесь есть кое-что.

  • Вам очень редко приходится явно проверять $?что-либо или сохранять это в переменной (, если только вам не нужно ссылаться на один и тот же статус выхода несколько раз ).
  • Статус выхода функции — это статус выхода последней выполненной команды в функции, поэтому явное returnтребуется редко (редко с явным возвращаемым значением значение по крайней мере ).
  • Функция, проверяющая существование каталога, не должна создавать никаких каталогов. Лучше назовите его create_dir_if_needed.
  • Ошибка в [ result==0 ]. Строка result==0— это строка не-нулевой длины, и проверка строки таким образом вернет истину , если строка имеет не-нулевую длину, поэтому проверка всегда верна. Вместо этого вы, вероятно, хотели [ "$result" -eq 0 ].
  • Не забывайте всегда заключать в двойные кавычки расширения переменных и подстановки команд, если только вы не знаете, в каких контекстах это не требуется .

Имея это в виду:

create_dir_if_needed () {
    mkdir -p -- "$1"
}

Это вернет статус выхода mkdir -p -- "$1". Эта команда создаст именованный каталог (и любые промежуточные каталоги ), если они еще не существуют. Если команде mkdirне удается создать каталог, она завершится с нулевым статусом выхода, отличным от -, который станет статусом выхода функции. mkdir -pне завершится ошибкой, если каталог уже существует.

Вы могли бы использовать это как

if ! create_dir_if_needed "$dirpath"; then
    printf 'Failed to create directory "%s"\n' "$dirpath" >&2
    exit 1
fi

или, поскольку функция тривиальна, вы можете избавиться от нее и сказать

if ! mkdir -p -- "$dirpath"; then
    printf 'Failed to create directory "%s"\n' "$dirpath" >&2
    exit 1
fi

Разновидность функции create_dir_if_needed, которая использует mkdirбез -pи поэтому никогда не создает отсутствующие родительские каталоги для заданного пути к каталогу:

create_dir_if_needed () {
    if [ -d "$1" ]; then
        return
    fi

    mkdir -- "$1"
}

или,

create_dir_if_needed () {
    [ -d "$1" ] || mkdir -- "$1"
}

Вызов этой функции вернет истину(ноль ), если каталог уже существует или если вызов mkdirпрошел успешно. Оператор returnбез явного значения вернет статус завершения самого последнего выполненного оператора, в этом случае он вернет положительный результат теста [ -d "$1" ].

16
27.01.2020, 20:21

Bash не работает как обычные языки программирования, когда речь идет о возвращаемых значениях.

Здесь вы путаете вывод из checkFolderExist с статусом возврата из checkFolderExist.

Ваши переменные CHECKINPUT и CHECKOUTPUT будут пустыми, потому что ваша функция ничего не делает echoи printf.

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

checkFolderExist "${INPUT}"
CHECKINPUT=$?

checkFolderExist "${OUTPUT}"
CHECKOUTPUT=$?

Помимо этого, я в любом случае рекомендую вам следовать советам в ответе Кусалананды , которые подскажут вам лучшие методы решения проблемы.

4
27.01.2020, 20:21

Теги

Похожие вопросы