Bash - 问题创造' goto'当量

时间:2015-03-30 03:59:29

标签: linux bash function eval goto

我正在将一系列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语句的识别有任何想法?

由于

1 个答案:

答案 0 :(得分:2)

不要尝试重新创建goto。您可以使用if模拟结构化控制流语句,例如whilegoto,但尝试反向操作将以悲伤结束。相反,弄清楚如何重写逻辑,因此它不需要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