linux - Bash - 创建 'goto' 等价物的问题

标签 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"

被忽略的编码是作为 point_x 编码的一部分出现的 if 语句。这些可以是:

if [ $var1 == yes ]; then
  xxxx
else
  :
fi

if [ ! -e $var1 ]; then
  xxxx
else
  :
fi

有没有人对如何让函数按预期工作并识别 if 语句有任何想法?

谢谢

最佳答案

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

相关文章:

java - 我怎样才能使 JSch 中的 session 持续更长时间?

android - 安装编译示例 4.0 失败 nvidia

linux - 使用此处文档时将 bash 输出写入文件

sql-server - 如何调用返回表数据类型的用户定义函数

linux - 使用bash脚本计算圆的面积和半径

linux - 修改 rootfs (petalinux on zynq)

bash - 在 bash 中用不同的 UUID 替换给定单词的每次出现的最简单方法

linux - 在 bash 中从占据终端整个宽度的破折号字符绘制一条水平线

python - 从函数返回用户提供的值

JavaScript。需要在函数内连接两个数组