如何在bash中退出if语句而不退出程序?

2024-03-13

重写这个问题以避免更多的反对票,因为对我来说删除它已经太晚了:

我正在编写一个脚本,要求用户确认之前sourcing一些其他脚本。为了简化代码,假设有两个脚本sourced,但我希望用户可以source没有或仅是其中一个脚本 - 不是两者都存在。我试图使用以下形式的声明if true source-script else exit这不起作用,因为我会退出if语句,而且是整个脚本,并且没有机会进行必要的清理。最初,我的脚本看起来像这样:

echo "This script might do something terrible to your computer."
read -p "Do you wish to continue? (y/[n]) " -n 1;
echo
if ! [[ $REPLY =~ ^[Yy]$ ]]
then
    source "terrible_script.sh"
    # want some way to ensure that we don't prompt the user about the next script
    # don't want to just exit if the response is 'n' because we have to do cleanup
fi

echo "This script might do something really good to your computer."
read -p "Do you wish to continue? (y/[n]) " -n 1;
echo
if ! [[ $REPLY =~ ^[Yy]$ ]]
then
    source "good_script.sh"
fi

# do cleanup here
# regardless of whether or not any scripts were sourced

@charles-duffy 提供了答案 - 只需将提示包装在函数中即可。就像是:

function badscript() {
    echo "This script might do something terrible to your computer."
    read -p "Do you wish to continue? (y/[n]) " -n 1;
    echo
    if ! [[ $REPLY =~ ^[Yy]$ ]]
    then
        source "terrible_script.sh"
        return 0
    fi
}

function goodscript() {
    echo "This script might do something really good to your computer."
    read -p "Do you wish to continue? (y/[n]) " -n 1;
    echo
    if ! [[ $REPLY =~ ^[Yy]$ ]]
    then
        source "good_script.sh"
    fi
}

if ! badscript
then
    goodscript
fi

# cleanup code here

第一:不要做任何这样的事情。以其他方式构建你的程序。如果您向我们描述why如果您认为您需要这种行为,我们可能已经告诉您如何实现它。


解决这个问题:如果你将你的块包裹在一个循环中,你可以使用break提前退出:

for _ in once; do
  if true; then
    echo "in the loop"
    break
    echo "not reached"
  fi
done
echo "this is reached"

或者,您可以使用一个函数,并且return提前退出:

myfunc() {
  if true; then
    echo "in the loop"
    return
  fi
  echo "unreached"
}
myfunc
echo "this is reached"

或者,您可以将循环包装在子 shell 中(尽管这会阻止它执行其他操作,例如影响子 shell 外部代码的变量赋值):

(if true; then
   echo "in the block"
   exit
   echo "unreached"
 fi)
echo "this is reached."
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在bash中退出if语句而不退出程序? 的相关文章

  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 错误:GitHub 目前无法显示这么大的文件 - 但该文件只有 1.06 MB [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我通过两种不同的方式将 HTML 文件上传到 GitHub 存储库 拖放以及使用终端上的 Git 添加 提交 推送 在这两种情况下
  • 从 bash 脚本运行节点

    很简单 我正在尝试使用 cron 自动运行 nodejs 脚本 但是脚本本身似乎无法运行该文件 我的脚本很简单 usr bin env node node var node assets js update js 但是 在运行此命令时 它返
  • 如何在 mac 中使用“getopt”命令让 bash 处理长参数?

    我想让我的 bash 脚本处理长参数 我发现getopt 但 OS X 不支持它 谁能告诉我为什么getoptBSD 实现了 GNU 没有实现 我尝试构建getopt在 GNU C lib 中 但由于我对 Linux 的技能不佳而失败了 有
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • 从 Ruby 运行 shell 命令:在显示输出时捕获输出?

    我有个问题 我想从另一个 ruby 脚本运行一个 ruby 脚本并捕获它的输出信息 同时让它也输出到屏幕上 runner usr bin env ruby print Enter your password password gets ch
  • 命令运行时从 shell_exec 命令获取输出

    我正在编写一个 PHP 脚本网页 该网页旨在接受先前上传到服务器的 JFFS2 图像的文件名 然后 该脚本将使用映像重新刷新服务器上的分区 并输出结果 我一直在用这个 tmp shell exec update flash v filena
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • 将 JSON 数组转换为 bash 数组并保留空格

    我想将 JSON 文件转换为 bash 字符串数组 稍后我可以对其进行迭代 我的JSON结构如下 USERID TMCCP CREATED DATE 31 01 2020 17 52 USERID TMCCP CREATED DATE 31
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何将长选项与 Bash getopts 内置一起使用?

    我正在尝试解析 tempBash getopts 的选项 我这样调用我的脚本 myscript temp foo bar someFile 这是我用来解析选项的代码 while getopts temp shots o option do
  • 保存和恢复陷阱状态?管理多个陷阱处理程序的简单方法?

    有什么好的方法可以覆盖bash陷阱处理程序不会永久破坏可能已设置或尚未设置的现有处理程序 动态管理任意陷阱例程链怎么样 有没有办法保存陷阱处理程序的当前状态 以便以后可以恢复 在 Bash 中保存和恢复陷阱处理程序状态 我将提交以下堆栈实现
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • bash 中的“declare -r”和“readonly”有什么区别?

    在 bash 中 有什么区别declare r and readonly declare r a a1 readonly b b1 我不知道该选择哪个 tl dr readonly使用默认范围global甚至在函数内部 declare使用范
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 使用 sed 删除非字母数字字符

    我正在尝试验证一些输入以删除一组字符 只允许使用字母数字字符加 句点 下划线 连字符 我测试了正则表达式 w here http gskinner com RegExr http gskinner com RegExr 它与我想要删除的内容
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u

随机推荐