我有"如果";循环并希望在我的";那么";部分命令将是";跳回行。。。并从那一行开始运行整个脚本";。我该怎么写
if [ -s file.txt ]
then
jump to command jump to line ....
else
<command>
fi
感谢
如何避免goto
并从某一点开始处理?例如,您希望重新开始处理,直到标志的值为5。
注释中提到了loop
。脏循环是这样的:
startfrom=0
flag=0
# Dirty loop, look to second code fragment for cleanup
while :; do
if ((startfrom==0)); then
echo "First time, all statements"
((startfrom++))
fi
if ((startfrom==1)); then
echo "Starting from line labelled 1"
((startfrom++))
((flag++))
fi
echo "Flag=$flag"
if ((flag<5)); then
echo "Simulating goto line labelled 1"
startfrom=1
continue
fi
echo "The End"
break
done
在你思考";好吧,这就是我想要的goto。你在bash中需要多大的开销";,看看第二个实现。
process_flag() {
((flag++))
echo "Flag=$flag"
if ((flag<5)); then
echo "Need to process again"
return 0
fi
return 1
}
flag=0
echo "First time, all statements"
while :; do
process_flag || break
done
echo "The End"
这看起来已经更好了。当函数较小时,可以将所有内容都放在loop
中。
flag=0
echo "First time, all statements"
while :; do
((flag++))
echo "Flag=$flag"
if ((flag<5)); then
echo "Need to process again"
continue
else
break
fi
done
echo "The End"
在这个例子中,您可以使用不同的loop
吗。在为每个步骤编写语句之前,请查看结构并思考您需要什么控制功能。也许你想要一个简单的
echo "First time, all statements"
for ((flag=1; flag<=5; flag++)); do
echo "Flag=$flag"
if ((flag<5)); then
echo "Need to process again"
fi
done
echo "The End"
当你的loop
的行数比你的屏幕多时,考虑使用一个函数来处理小细节。
(注意:这是一个糟糕的想法(
外壳不会给你一个goto,但你可以制造一个!
#!/bin/bash
echo executing before label
# label:
goto() {
target="$1"
shift
exec sh -c "$(sed -e "1,/^# $target:$/d" $0)" "$0" "$@"
}
echo executing from label args: $@
if test "$1" = 5; then
shift
goto label "$@"
fi
说真的,不要这样做。