shell脚本中的for循环不迭代

时间:2016-07-26 01:20:48

标签: shell

我有一个反复发生的问题,第一个for循环(d)没有迭代到它的下一个指示值(1)。关于我做错了什么的任何想法?我已经尝试过使用continue命令来"手动"强制for循环迭代到它的下一个值,但这并没有奏效。本质上,每次运行代码时,它都会完成for循环的(0)迭代,但在终端中停止而不显示任何错误消息。我已经简化了第二个嵌套for循环,因此它只有一个值(0)以便压缩代码。提前谢谢!

<?php

2 个答案:

答案 0 :(得分:3)

这个命令可能成为问题吗?

cat > compiledScores$gwasn

这将使您的整个脚本停止,等待输入cat

如果脚本挂起,请使用pstree之类的实用程序查看进程沿袭(从另一个终端,或者在使用Ctrl-Z暂停脚本后,如果可能)。

我的hang.sh脚本中有什么内容?

$ cat hang.sh 
#!/bin/sh

cat

就是这样。让我们运行它,并暂停:

$ ./hang.sh 
^Z
[1]+  Stopped                 ./hang.sh

显示pstree输出的摘要:

$ pstree | grep hang
     |                |      |-hang.sh---cat

请参阅:hang.sh正在运行,并且有一个孩子:cat

查找脚本挂起位置的另一个工具是使用set -x打开其跟踪模式。我现在hang.sh的内容是什么?

$ cat hang.sh 
#!/bin/sh

set -x

grep -s foo /dev/null # silent command
cat
grep -s bar /dev/null # silent command

cat被两个不产生任何输出的无声命令所包围。但是我们在顶部有一个set -x来启用命令跟踪:

$ ./hang.sh 
+ grep -s foo /dev/null
+ cat

啊哈!它执行了第一个grep,然后卡在cat中,之后没有达到命令。

答案 1 :(得分:0)

如果d没有迭代到下一个值,可能的问题是你在do循环的for部分产生了一个子shell。您可以在调试模式下运行脚本,即

#!/bin/bash -x # x for the debug mode

在您生成子shell时发现

<强>图片的标题说明

for t in 0
do
#stuff
done

t只能有一个零值。

另外

if [ $t = 0 ]; then 

应该是

if [ $t -eq 0 ]; then # -eq for integers = for strings