我正在将一系列 csh 脚本转换为 bash,因为它们需要在两个不同的系统上工作。目前脚本在一个系统上工作,但在另一个系统上不能正常工作。转换为 bash 是必需的,因此它们可以在两者上工作。此外,脚本需要一些特定的编码才能在一个系统上运行(这不会影响它在另一个系统上的运行方式)。
到目前为止,所有转换后的脚本都可以正常工作,但我现在有一个脚本,其中包含“goto”功能。由于 bash 没有等效的“goto”,我一直在努力寻找可行的解决方案。
该脚本有许多从单独的配置文件中提取的开始和结束选项。然后,这些允许脚本在不同的点开始和停止。例如:
起点:POINT_A/POINT_B
结束:POINT_B/POINT_C
这意味着脚本可以从 POINT_A 或 B 开始,但 POINT A 可以在 B 或 C 结束,或者 POINT_B 只能在 C 结束。脚本的点数比这更多,但这应该可以解释脚本需要做什么做。
我发现了一个似乎有效的函数,但其中包含“eval”,显然这是一个错误的代码,不应使用。它还似乎与某些 if 语句冲突(即忽略编码并发生错误)。我正在寻找比我目前拥有的解决方案更好的解决方案:
begin=$1
finish=$2
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$')
eval "$cmd"
exit
}
start=${begin:-"start"}
end=${finish:-"end"}
jumpto $start
POINT_A:
echo "start at POINT_A"
# point_a coding here
if [ $end == "POINT_B" ]; then
echo "Done POINT_A commands, finished working before POINT_B"
exit 0
else
jumpto POINT_B
fi
POINT_B:
echo "start at POINT_B"
# point_b coding here
if [ $end == "POINT_C" ]; then
echo "Done POINT_B commands, finished working before POINT_C"
exit 0
else
jumpto POINT_C
fi
POINT_C:
echo "all finished"
被忽略的编码是作为 point_x 编码的一部分出现的 if 语句。这些可以是:
if [ $var1 == yes ]; then
xxxx
else
:
fi
if [ ! -e $var1 ]; then
xxxx
else
:
fi
有没有人对如何让函数按预期工作并识别 if 语句有任何想法?
谢谢
最佳答案
不要尝试重新创建 goto
。您可以使用 goto
模拟结构化控制流语句,例如 if
和 while
,但尝试相反的操作将以悲伤告终。相反,弄清楚如何重写逻辑,使其不需要 goto
。
if [[ $start == POINT_A ]]; then
echo point A stuff
fi
echo point B stuff
if [[ $end == POINT_B ]]; then
exit
fi
echo point C stuff
关于linux - Bash - 创建 'goto' 等价物的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29338189/