我正在将一系列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"
忽略的编码是if语句作为point_x编码的一部分出现的。这些可以是:
if [ $var1 == yes ]; then
xxxx
else
:
fi
if [ ! -e $var1 ]; then
xxxx
else
:
fi
有没有人对如何让函数按预期工作并获得if语句的识别有任何想法?
由于
答案 0 :(得分:2)
不要尝试重新创建goto
。您可以使用if
模拟结构化控制流语句,例如while
和goto
,但尝试反向操作将以悲伤结束。相反,弄清楚如何重写逻辑,因此它不需要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