BASH trở lại chức năng chính


7

Tôi có một tập lệnh BASH gọi một hàm, gọi các hàm khác:

#!/bin/bash
function foo
{
    function bar
    {
        # do something
    }
    bar
}
foo

Làm thế nào tôi có thể trở lại từ bartrực tiếp đến chức năng chính? Trường hợp là barxử lý đầu vào của người dùng và nếu nó nhận được câu trả lời phủ định, nó phải quay trở lại chức năng chính, nếu không thì phải quay lại foo.

Trở về fookhông phải là một vấn đề với một returntuyên bố đơn giản . Mặt khác, tôi đã thử cái này (mà thực sự hoạt động):

#!/bin/bash
function foo
{
    function bar
    {
        if [negative] # abstract statement
        then return 1
        else return 0
        fi
    }
    ! bar && return
}
foo

Nhưng vì tôi có các chức năng như footrải đều trên toàn bộ dự án ( barđược xác định trong tệp tiêu đề), có cách nào chỉ yêu cầu sửa đổi barkhông? Dự án dài ~ 2k dòng và bao gồm một số tệp, sẽ dễ dàng hơn nhiều nếu có giải pháp.


Tôi không nghĩ rằng điều này tồn tại. Đây sẽ là tương đương của a goto, không tồn tại trong bash theo như tôi biết.
polym

@polym Không, BASH không có gì gotođáng tiếc.
psimon

Câu trả lời:


4

Không có cách nào tốt đẹp (tôi biết) để làm điều đó nhưng nếu bạn sẵn sàng trả giá ...

Thay vì đặt mã trong các chức năng, bạn có thể đặt nó vào các tệp bạn nguồn. Nếu các hàm cần đối số thì bạn phải chuẩn bị chúng với set:

set -- arg1 arg2 arg3
source ...

Ba tập tin:

  1. testscript.sh

    #! /bin/bash
    
    startdir="$PWD"
    
    echo mainscript
    
    while true; do
            echo "begin: helper loop"
            source "${startdir}/func_1"
            echo "end: helper loop"
            break
    done
    
    echo mainscript
  2. func_1

    echo "begin: func_1"
    source "${startdir}/func_2"
    echo "end: func_1"
  3. func_2

    echo "begin: func_2"
    echo break from func_2
    break 100
    echo "end: func_2"

Kết quả:

> ./testscript.sh
mainscript
begin: helper loop
begin: func_1
begin: func_2
break from func_2
mainscript

Có vẻ thú vị ... Nếu tôi hiểu đúng, điểm chính ở đây là cách sử dụng break 100, trả về vòng lặp của người gọi , không phải chức năng của người gọi .
psimon

1
@psimon Điểm quan trọng là breakcó thể bỏ qua các cấp độ trong khi returnkhông thể.
Hauke ​​Laging
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.