我有一个 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 的错,而是语言设计者的脑残。