解决bash脚本没有goto的问题

解决bash脚本没有goto的问题

我有一个 bash 脚本,我想做类似的事情

read one_thing
read another_thing

然后运行一些代码来查看是否another_thing可用或已被占用,如果已被占用,它应该警告用户并再次运行

read another_thing

这样我们就可以得到一个新值,而不会受到one_thing干扰。由于 bash 中没有goto,我想知道如何做到这一点。到目前为止,我最好的猜测是,也许我应该包装read another_thing在一个函数中,这样如果需要,它就会调用自己,但我觉得一定有一种“更干净”的方式来做到这一点。我正在寻找关于如何高效地做到这一点的建议。

答案1

您可以循环检查您的条件,并break在条件满足时退出。

#!/bin/bash

read -p 'Input something > ' one_thing

while true; do
  read -p 'Input something else > ' another_thing

  # Write some code to check if the requirements are met
  # Let's say in this case they are when the variable `thing_to_work` equals `done`

  if [[ "${thing_to_work}" == 'abcde' ]]; then
    break # Exit the loop
  else
    echo 'The requirements were not met, so the loop will start again'
  fi
done

答案2

当我从 Windows 转到 Linux 桌面时,我有很多预先存在的.BAT文件.CMD需要转换,而且我不打算重写它们的逻辑,所以我成立goto一种在 bash 中执行的方法,因为该goto函数sed自行运行以删除脚本中不应该运行的任何部分,然后对其进行全部评估。下面的源代码对原始源代码进行了稍微修改,以使其更加健壮:

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo $goto_msg

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

我一点也不感到内疚,正如 Linus Torvalds 所说:

发件人:Linus Torvalds
主题:回复:2.6.0-test* 有机会吗?
日期:2003 年 1 月 12 日星期日 11:38:35 -0800 (PST)

我认为 goto 很好,而且它们通常比大量缩进更具可读性。尤其如果代码流实际上不是自然缩进的,则为 true(在这种情况下是这样的,所以我不认为使用 goto 是更清晰但一般来说,goto 的可读性会很好)。

当然,在像 Pascal 这样愚蠢的语言中,标签无法描述,goto 可能很糟糕。但这不是 goto 的错,而是语言设计者的脑残。

代码来源 (已修改,以减少错误发生)
引文来源

相关内容