2016-07-26 164 views
1

我有一個循環問題,第一個for循環(d)沒有迭代到它的下一個指示值(1)。任何想法,我做錯了什麼?我試過使用continue命令來「手動」強制for循環迭代到它的下一個值,但那沒有奏效。從本質上講,每次運行代碼時,它都會完成for循環的(0)迭代,但隨後停止在終端中而不顯示任何錯誤消息。我簡化了第二個嵌套for循環,以便它只有一個值(0)以便壓縮代碼。提前致謝!for循環shell腳本不迭代

#!/bin/bash 
# PRSice Commands 

dates=$(date +"%m_%d_%Y") 
cd /media/sf_Completed_PRS/ 
mkdir PRS_$dates 

echo "Name of input (target) data set: " 
read targetname 

cd /media/sf_VMShare/ 
mv $targetname.bim /home/brainlab/ 
mv $targetname.fam /home/brainlab/ 
mv $targetname.bed /home/brainlab/ 

for d in 0 1 2 
do 
    if [ $d = 0 ]; then 
     gwas=mddgwas.assoc 
     gwasn=MDD 
    fi 

    if [ $d = 1 ]; then 
     gwas=scz2.assoc 
     gwasn=SCZ2 
    fi 

    if [ $d = 2 ]; then 
     gwas=BIP.assoc 
     gwasn=BIP 
    fi 

    cd /media/sf_Completed_PRS/PRS_$dates/ 
    directory=$gwasn 
    mkdir $directory 

    for t in 0 
    do 

     if [ $t = 0 ]; then 
      lower=.0001 
      inc=.0009 
      upper=.001 
     fi 

     if [ $t = 1 ]; then 
      break 
     fi 

     cd /home/brainlab 
     R --file=PRSice_v1.25.R -q --args \ 
     base $gwas \ 
     target $targetname \ 
     slower $lower \ 
     supper $upper \ 
     sinc $inc \ 
     clump.p1 1 \ 
     clump.p2 1 \ 
     clump.r2 0.1 \ 
     clumb.kb 500 \ 
     no.regression T \ 
     plink ./plink_1.9_linux_160914 \ 
     figname compare_1\ 

     cd /home/brainlab 

     if [ $t = 0 ]; then 
      mv PROFILES.0.0001.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.0010.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
     fi 

     if [ $t = 1 ]; then 
      mv PROFILES.0.01.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.05.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
     fi 

     if [ $t = 2 ]; then 
      mv PROFILES.0.1.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.2.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.3.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.4.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.0.5.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
     fi 

     if [ $t = 3 ]; then 
      mv PROFILES.1.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
      mv PROFILES.2.profile /media/sf_Completed_PRS/PRS_$dates/$directory 
     fi 
    done 

    cd /media/sf_Completed_PRS/PRS_$dates/$directory 
    sed 's/SCORE/SCORE-0.0001/' PROFILES.0.0001.profile > new_file && mv new_file PROFILES.0.0001.profile 
    sed 's/SCORE/SCORE-0.0010/' PROFILES.0.0010.profile > new_file && mv new_file PROFILES.0.0010.profile 
    sed 's/SCORE/SCORE-0.01/' PROFILES.0.01.profile > new_file && mv new_file PROFILES.0.01.profile 
    sed 's/SCORE/SCORE-0.05/' PROFILES.0.05.profile > new_file && mv new_file PROFILES.0.05.profile 
    sed 's/SCORE/SCORE-0.1/' PROFILES.0.1.profile > new_file && mv new_file PROFILES.0.1.profile 
    sed 's/SCORE/SCORE-0.2/' PROFILES.0.2.profile > new_file && mv new_file PROFILES.0.2.profile 
    sed 's/SCORE/SCORE-0.3/' PROFILES.0.3.profile > new_file && mv new_file PROFILES.0.3.profile 
    sed 's/SCORE/SCORE-0.4/' PROFILES.0.4.profile > new_file && mv new_file PROFILES.0.4.profile 
    sed 's/SCORE/SCORE-0.5/' PROFILES.0.5.profile > new_file && mv new_file PROFILES.0.5.profile 
    sed 's/SCORE/SCORE-1/' PROFILES.1.profile > new_file && mv new_file PROFILES.1.profile 
    sed 's/SCORE/SCORE-2/' PROFILES.2.profile > new_file && mv new_file PROFILES.2.profile 

    cat > compiledScores$gwasn 

    awk '{print $1,$2,$6}' PROFILES.0.0001.profile > compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.0010.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.01.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.05.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.1.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.2.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.3.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.4.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.0.5.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 
    awk '{print $6}' PROFILES.1.profile > tempfile.txt 
    pr -m -t -J compiledScores$gwasn tempfile.txt > new_file && mv new_file compiledScores$gwasn 

    column -t compiledScores$gwasn > new_file && mv new_file compiledScores$gwasn 

done 
+2

很難找到沒有縮進的每個for的'done'。 – Kaz

+0

https://en.wikipedia.org/wiki/Stray_Cat_Blues – Kaz

回答

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,之後沒有達到命令。

+0

希望我能再投票多次。絕對是這種情況下的問題。很好的接收。 –

+0

非常感謝!這似乎是確切的問題! – user6407765

0

如果d不迭代到下一個值,可能的問題是,你產卵在for循環的do部分子殼。您可以運行在調試模式下運行腳本,即

#!/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 
+0

感謝您的回覆! 「t」for循環不是我遇到的問題,而是循環的「d」。我剛剛擺脫了額外的t值來測試一些東西。 – user6407765