+ -
当前位置:首页 → 问答吧 → 循环套循环的问题.

循环套循环的问题.

时间:2011-07-29

来源:互联网

最里面的循环 错误退出.exit 1只能退到外层循环。
用什么命令 能直接退出啊。不继续执行程序了

作者: xiaoying1599   发布时间: 2011-07-29

你说的啥语言?!
shell perl都是这样的啊
[root@test ~]# cat test.sh
#!/bin/bash
for i in $(seq 1 10)
do
  for y in $(seq 1 10)
  do
  for z in $(seq 1 10)
  do
  echo $i$y$z
  exit 1
  done
  done
done
[root@test ~]# ./test.sh
111

作者: steptodream   发布时间: 2011-07-29

把程序发上来看看吧,不太可能的
exit 1应该是shell语法吧

作者: thefirstz   发布时间: 2011-07-29

什么程序?C程序还是脚本?
exit应该会直接退出整个程序的

作者: justkk   发布时间: 2011-07-29

[root@test ~]# cat test.pl
#!/usr/bin/perl
for($i=0;$i<10;$i++){
  for($j=0;$j<10;$j++){
  for($z=0;$z<10;$z++){
  print "$i-$j-$z\n";
  exit 1;
  }
  }
}
[root@test ~]# ./test.pl
0-0-0

作者: steptodream   发布时间: 2011-07-29

#loop start
while [ $i -lt ${#RLS_DIR_LST[*]} ]; do
echo ${RLS_DIR_LST[$i]} | while read RLS_SRC_SVTYPE RLS_SRC_DIR RLS_TO_DIR RLS_FILE_TYPE RLS_USER RLS_GROUP RLS_PERMISSION
  do
 
LENV_RL_LISTFILE=`ls -l ${WORK_AREA_PATH}/${RLS_SRC_DIR} | grep "^-" | awk '{print "'${WORK_AREA_PATH}${RLS_SRC_DIR}'/" $9}'`  

#check release directory exist 
  if [ ! -d "${RLS_TO_DIR}" ]; then
  /bin/echo "`/bin/date +'%Y/%m/%d %H:%M:%S'` release directory ${RLS_TO_DIR} is not exist" >> ${LOGFILE}
  /bin/echo "ERROR" > ${TRGFILE}
  error_exit ${LOGFILE} "${MYNAMEEN}"
   
fi
#check permisstion of release directory  
  if [ ! -w "${RLS_TO_DIR}" ]; then
  /bin/echo "`/bin/date +'%Y/%m/%d %H:%M:%S'` release directory ${RLS_TO_DIR} is not be write" >> ${LOGFILE}
  /bin/echo "ERROR" > ${TRGFILE}
  exit 1
   
  fi
echo ${RLS_TO_DIR}
 

done
let i++
#loop end

作者: xiaoying1599   发布时间: 2011-07-29

#check release directory exist 
  if [ ! -d "${RLS_TO_DIR}" ]; then
  /bin/echo "`/bin/date +'%Y/%m/%d %H:%M:%S'` release directory ${RLS_TO_DIR} is not exist" >> ${LOGFILE}
  /bin/echo "ERROR" > ${TRGFILE}
  error_exit ${LOGFILE} "${MYNAMEEN}"
   
fi
正常这个地方 判断出错 就应该 error_exit ${LOGFILE} "${MYNAMEEN}" 这个是公共方法.就是exit
但是 他还继续 循环 判断下一个 ${RLS_TO_DIR}

作者: xiaoying1599   发布时间: 2011-07-29

虽然我还没学到shell
不过我很怀疑你是否执行到了exit
是否可以在exit前增加一条打印信息

作者: q191201771   发布时间: 2011-07-29

引用 7 楼 q191201771 的回复:

虽然我还没学到shell
不过我很怀疑你是否执行到了exit
是否可以在exit前增加一条打印信息

执行到了.退出了当前的循环 开始了一下次 循环......

作者: xiaoying1599   发布时间: 2011-07-29

引用 8 楼 xiaoying1599 的回复:

引用 7 楼 q191201771 的回复:

虽然我还没学到shell
不过我很怀疑你是否执行到了exit
是否可以在exit前增加一条打印信息

执行到了.退出了当前的循环 开始了一下次 循环......

我知道你的错误了!!!

你的循环结构是
while do
  echo "xxxx" | wihle do
  exit 1
  done
done

看到了吗 你的第二层循环是在管道里 所以你的exit 1仅仅是在一个管道里执行了 
当然不会退出整个程序!!

作者: steptodream   发布时间: 2011-07-29

最简单的例子就是这样
#!/bin/bash
echo "hello" | exit 1
echo "going on...haha"

这里的exit 1是在管道里 是不会退出程序的 还会输出going on...haha

作者: steptodream   发布时间: 2011-07-29

echo ${RLS_DIR_LST[$i]} | while read RLS_SRC_SVTYPE RLS_SRC_DIR RLS_TO_DIR RLS_FILE_TYPE RLS_USER RLS_GROUP RLS_PERMISSION
  do
你这个循环就是为了读取参数吧 实际就运行了一次吧 不要这层循环 比如改成这样的简单结构
RLS_SRC_SVTYPE=$(echo ${RLS_DIR_LST[$i]} | awk '{print $1}')
RLS_SRC_DIR=$(echo ${RLS_DIR_LST[$i]} | awk '{print $2}')
RLS_TO_DIR=$(echo ${RLS_DIR_LST[$i]} | awk '{print $3}')
RLS_FILE_TYPE=$(echo ${RLS_DIR_LST[$i]} | awk '{print $4}')
RLS_USER=$(echo ${RLS_DIR_LST[$i]} | awk '{print $5}')
RLS_GROUP=$(echo ${RLS_DIR_LST[$i]} | awk '{print $6}')
RLS_PERMISSION=$(echo ${RLS_DIR_LST[$i]} | awk '{print $7}')

作者: steptodream   发布时间: 2011-07-29

exit 1是退出当前shell

作者: lgxwqq111   发布时间: 2011-07-29

引用 11 楼 steptodream 的回复:

echo ${RLS_DIR_LST[$i]} | while read RLS_SRC_SVTYPE RLS_SRC_DIR RLS_TO_DIR RLS_FILE_TYPE RLS_USER RLS_GROUP RLS_PERMISSION
do
你这个循环就是为了读取参数吧 实际就运行了一次吧 不要这层循环 比如改成这样的简单结构
RLS_SRC_SVTYPE=$(echo……


难不成 只有这个方法了嘛...

作者: xiaoying1599   发布时间: 2011-07-29

引用 13 楼 xiaoying1599 的回复:
难不成 只有这个方法了嘛...

代码简单有什么不好 老用管道本身就不好。
肯定不只这一种方法 我只是给个例子 你可以自己想办法啊

作者: steptodream   发布时间: 2011-07-29

引用 14 楼 steptodream 的回复:

引用 13 楼 xiaoying1599 的回复:
难不成 只有这个方法了嘛...

代码简单有什么不好 老用管道本身就不好。
肯定不只这一种方法 我只是给个例子 你可以自己想办法啊

嗯..谢谢老师指点~

作者: xiaoying1599   发布时间: 2011-07-29