Как выйти из родительской функции на основе возвращаемого значения дочерней функции?

#bash

#bash

Вопрос:

 #!/bin/bash
#make your own choice,decide which function should be run
set -e
keyin(){
    read -e -p "$1 input y,otherwise input n" local yorn
    if [[ "y" == "$yorn" || "Y" == "$yorn" ]]; then
        return 0
    fi
}
fun1(){
    keyin 'update software no.1'
    echo 'how to exit this function?'
}
fun2(){
keyin 'update software no.2'
echo "fun2 is still running"
}
fun1
fun2
  

Когда я запускаю этот скрипт и ввожу данные y , я хочу выйти fun1 и продолжить выполнение fun2 .
Как это сделать?

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

Ответ №1:

Как насчет обработки возвращаемого значения функции?

 keyin() {
    # read -e -p "$1 input y,otherwise input n" local yorn
    yorn=n
    if [[ "y" == "$yorn" || "Y" == "$yorn" ]]; then
        return 0
    fi
    return 1 # return nonzero in case of error
}

fun1() {
    # handle the return value - in case of non-zero execute custom action
    if ! keyin 'update software no.1'; then
        return
    fi
    echo 'how to exit this function?'
}

fun2() {
    echo "fun2 is still running"
}

fun1
fun2
  

Просто if function; then давайте выполним действие в зависимости от того, было ли возвращаемое значение функции нулевым или ненулевым.

Инструкция read .... local yorn считывает значение в переменной с именем local . Я думаю, вы имели в виду просто read .... yorn без local слова.

Комментарии:

1. return 1 завершит работу всего скрипта из-за set -e

2. Инструкция read .... local yorn считывает переменную с именем yorn , local означающим локальную переменную.

3. @kittygirl Нет, этого не будет. set -e завершите работу скрипта в случае «не обработанных» возвращаемых значений. Так false завершится сценарий. Но if false; then true; else true; fi этого не произойдет, потому что оператор if возвращает истинное значение. if ... ; then ... fi; Анализируется как один оператор для set -e . Возвращаемое значение if является последней выполненной командой, поэтому if true; then false; fi , тем не менее, скрипт завершит работу.

4. @kittygirl Нет, это не так. Строка local в read .. local интерпретируется как имя переменной. Вы хотите local yorn; read ... yorn .