回到脚本开头的最佳方法是啥?

Posted

技术标签:

【中文标题】回到脚本开头的最佳方法是啥?【英文标题】:what is the best way to go back to the beginning of a script?回到脚本开头的最佳方法是什么? 【发布时间】:2015-02-11 00:30:59 【问题描述】:

我有一个包含多个输入的脚本,该脚本最终会启动下载,一旦下载完成,我想提示用户在他们想要下载其他内容时重新开始该过程。

while true;do
    read -p "Is this correct? (yes/no/abort) " yno
    case $yno in
        [Yy]*) break;;
        [Nn]*) echo "Lets Start Over" 'restart script code goes here';;
        [Aa]*) exit 0;;
            *) echo "Try again";;

    esac
done

echo
echo "Starting $build download for $opt1 from Jenkins"
echo

while true;do
    read -p "Do you want to download something else? " yesno
    case $yesno in
        [Yy]* ) 'restart script code goes here';;
        [Nn]* ) break;;
        * ) echo "Try Again "
    esac
done

【问题讨论】:

您可以使用exec $0 将当前调用替换为新调用,从顶部开始(并且不使用新进程,这有一些优势)。或者,使用redo=yes; while [ "$redo" = "yes" ]; do ...your current code...; done,如果用户不想再次尝试,您可以在其中修改代码以设置redo=no。在两者之间,循环更为传统。 这与shell脚本无关,您需要在开始实现它们之前学习有关条件语句和循环的基础知识。我建议先创建一个程序流程图。 (用铅笔) 【参考方案1】:

如果你用 shell 函数设计你的 shell 脚本,重复一段代码会变得容易得多:

main() 
    while true; do
        next
        if ! validate_opt 'Do you want to download something else?'; then
            break
        fi
    done

validate_opt() 
    local PS3="$1 (Press ctrl-c to exit) "
    local choice
    select choice in yes no; do
        # This can be written more tersely,
        # but for clarity...
        case $choice in
            yes) return 0;;
             no) return 1;;
        esac
    done

do_download() 
    echo
    echo "Starting $build download for $opt1 from Jenkins"
    echo
    fetch "$1" # or whatever

next() 
    if validate_opt 'Is this correct?'; then
        do_download "$opt"
    else
        echo "Let's start over"
    fi

main

【讨论】:

【参考方案2】:
function stage1 
while true;do
    read -p "Is this correct? (yes/no/abort) " yno
    case $yno in
        [Yy]*) stage2;;
        [Nn]*) continue;;
        [Aa]*) exit 0;;
            *) echo "Try again";;

    esac
done


function stage2 
echo
echo "Starting $build download for $opt1 from Jenkins"
echo

while true;do
    read -p "Do you want to download something else? " yesno
    case $yesno in
        [Yy]* ) stage1;;
        [Nn]* ) exit 0;;
        * ) echo "Try Again ";;
    esac
done


stage1

你可以使用函数来做到这一点

第一个函数是stage 1,第二个stage2 列出所有函数后,在文件底部我们调用 stage1. 当函数 stage1 执行并 $yno= Y* or y* 时,它将跳到 stage2 函数,反之亦然,当我们在 stage2 时

【讨论】:

这个问题是调用一个函数不只是“跳到”它——它会创建一个堆栈帧,然后,在运行该函数后展开堆栈,返回 back 到函数完成时的旧位置;最终,过多的堆栈帧(如果没有展开)将导致堆栈溢出。

以上是关于回到脚本开头的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

确定当前 PowerShell 脚本位置的最佳方法是啥?

通过表单按钮在 laravel 中触发 php 脚本的最佳方法是啥?

在启动时保持 bash 脚本在后台循环的最佳方法是啥 - Linux?

在谷歌应用程序脚本中解析 html 的最佳方法是啥

唯一标识 DOM 节点的最佳方法是啥?

在部署后脚本中使用已删除列中的值的最佳方法是啥