KSH 中是否有一种方法可以退出 case 语句并转到特定行以便下次执行代码?或者有可以使用的 goto 标签吗?使用类似的东西而不是嵌套大量分支?
虽然发布问题的简化示例总是有帮助的(但这涵盖了您期望的所有意外情况),但鉴于您对 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。
我希望这有帮助。
没有标签或跳转。但是,您可以通过将数字传递给“break”内置函数来退出深度嵌套循环:break 2 退出两级,break 3 退出三级,等等。
有一个 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
我创建了以下名为 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(前面带有“_”)并从那里执行。