UNIX KSH 脚本中有“Goto”吗?

问题描述 投票:0回答:4

KSH 中是否有一种方法可以退出 case 语句并转到特定行以便下次执行代码?或者有可以使用的 goto 标签吗?使用类似的东西而不是嵌套大量分支?

linux unix shell ksh
4个回答
3
投票

虽然发布问题的简化示例总是有帮助的(但这涵盖了您期望的所有意外情况),但鉴于您对 Mark Read 的评论回复,您可以将输入提示包装到 while 循环中,例如

while ${keepTrying:-true} ; do
   echo "enter Yes or No"
   read yOrN
   case "${yOrN} in
     [Yy]* ) 
       # do something 
       keepTrying=false
     ;;
     [Nn]* )
       # do something else
        keepTrying=false
    ;;
     * )
       echo "bad input"
     ;;
   esac
done

# continue with script
# ....

另外,我同意 Mark 的观点,ksh 中没有标签或 goto。

我希望这有帮助。


2
投票

没有标签或跳转。但是,您可以通过将数字传递给“break”内置函数来退出深度嵌套循环:break 2 退出两级,break 3 退出三级,等等。


0
投票

有一个 bash goto 实现,如果你想将其适配到 ksh(我到目前为止还没有)

#!/bin/bash

function gowto
{
    label=$1
    # works in Linux bash, but barks in ksh
    cmd=$(sed -n "/#$label:/{:a;n;p;ba};" $0 | grep -v ':$')
    #
    eval "$cmd"
    exit
}

echo step 1

gowto skip

echo To be skippped

#skip:

echo Step 2

0
投票

我创建了以下名为 GOTO.ksh 的脚本:

#!/bin/ksh
#set -xv

OLD="$0"
NEW=/tmp/_$(basename "$0")
rm -f "$NEW"

grep "^#GOTO " "$OLD" | while read A B C
do
    [ -f "$NEW" ] || cp "$OLD" "$NEW"
    # printf "A=$A\nB=$B\nC=$C\n\n"
    sed -e "/^#GOTO $B/,/^#$B/s@^@\#. @" < "$NEW" > "$NEW"x && mv "$NEW"x "$NEW"
done
[ -f "$NEW" ] && { echo rm \"$NEW\" >> "$NEW" ;sync ; exec ksh "$NEW" $@; }

在 ksh 脚本中,如果需要 goto(用于调试),我按如下方式调用它:

. ~/bin/GOTO.ksh

现在,如果确实想跳过 ksh 命令,只需输入:

#GOTO labelA
.... commands to be skipped ....
#labelA

.... commands to be executed ....

#GOTO labelB
.... commands to be skipped ...
#labelB

如果脚本中有#GOTO行,这些行将被注释掉,脚本将被写入/tmp(前面带有“_”)并从那里执行。

© www.soinside.com 2019 - 2024. All rights reserved.