2010-03-25 59 views
1

另一個我找不到答案,感覺就像我瘋了一樣。
我有一個BASH腳本,它使用for循環在很多文件(〜5000)上運行一個複雜的命令(許多蛋白質序列比對)。循環產生的語句將在單獨給出時執行(即從錯誤消息複製粘貼到命令提示符),但在循環內返回「無此類文件或目錄」。下面的腳本;實際上還有幾個參數,但是這包括一些代表性參數和文件參數。 BASH語句單獨執行,但在for循環中返回「no such file」

 
#!/bin/bash

# Pass directory with targets as FASTA sequences as argument. # Arguments to psiblast # Common db=local/db/nr/nr outfile="/mnt/scratch/psi-blast" e=0.001 threads=8 itnum=5 pssm="/mnt/scratch/psi-blast/pssm." pssm_txt="/mnt/scratch/psi-blast/pssm." pseudo=0 pwa_inclusion=0.002

for i in ${1}/* do filename=$(basename $i) "local/ncbi-blast-2.2.23+/bin/psiblast\ -query ${i}\ -db $db\ -out ${outfile}/${filename}.out\ -evalue $e\ -num_threads $threads\ -num_iterations $itnum\ -out_pssm ${pssm}$filename\ -out_ascii_pssm ${pssm_txt}${filename}.txt\ -pseudocount $pseudo\ -inclusion_ethresh $pwa_inclusion" done

運行此腳本給「<腳本名>線<最後一行之前‘完成’>:<嘗試命令>:沒有這樣的文件或目錄。如果我再貼上嘗試命令到提示它將運行 。
這些命令中的每一個需要幾分鐘來運行。

回答

2

嘗試不帶引號。你忘了一些斜線。

for i in ${1}/* 
do 
filename=$(basename $i) 
local/ncbi-blast-2.2.23+/bin/psiblast \ 
-query "${i}" \ 
-db "$db" \ 
-out "${outfile}/${filename}.out" \ 
-evalue "$e" \ 
-num_threads "$threads" \ 
-num_iterations "$itnum" \ 
-out_pssm "${pssm}/$filename" \ 
-out_ascii_pssm "${pssm_txt}/${filename}.txt" \ 
-pseudocount "$pseudo" \ 
-inclusion_ethresh "$pwa_inclusion" 
done 
+0

的斜線不應該在那裏,變量給出的絕對路徑再加上常見的文件名後綴。 – 2010-03-25 10:26:55

+0

未引用整個多行命令修復它,謝謝。 – 2010-03-25 10:28:39

0

如果正在迭代的文件名中有空格,則會出現您正在觀察的行爲。出於這個原因,你要正確地引用您的文件名,如下面的小例子:for循環使用時

#!/bin/bash 
for i in * 
do 
    filename="$(basename "$i")" 
    command="ls -lah '$filename'" 
    echo "filename=$filename" 
    echo "Command = $command" 
    eval "$command" 
done 
+0

我的文件名都沒有空格。無論如何添加引號都無濟於事。 – 2010-03-25 10:23:10

0

加引號的文件名也無濟於事。爲了克服這個問題,我一直在做類似的事情在下面的例子中,每當我需要遍歷文件名:

ls -1 directory | { while read line; do echo $line; done; }