2016-07-05 109 views
1

我是新来的bash脚本。我想要逐行读取包含表格的文件。在每一行我都想把值赋给变量。这基本上是我的代码的格式:虽然循环错误:语法错误附近的意外令牌`完成'

#!/bin/bash 

while IFS= read -r line; do 
    echo $a $b $c $d 
    #if statements… 
done < test.txt 

我得到这个错误:“虽然环错误:附近意外的标记语法错误'完成””

任何想法是错我的代码?我试着查看与同一个错误有关的其他几个问题,但我无法修复我的代码。感谢您的帮助!

编辑:这是整个代码。它可能有其他错误(我真的是一个初学者),但我希望它有帮助。

#!/bin/bash 

experiment_database="/home/gperron/datasets/ENCODE_tables/final_tables/test_experiment_database.txt" 
file_database="/home/gperron/datasets/ENCODE_tables/final_tables/test_file_database.txt" 

EXPERIMENT=`cat $experiment_database | head -n $PBS_ARRAYID | tail -n 1 | cut -f1` 
echo "EXPERIMENT #$PBS_ARRAYID: $EXPERIMENT" 

while IFS= read -r line; do 
     echo $file_ID $experiment $target $biological_replicate $technical_replicate $read_number $url $fastq_file $genome 
     if [ "$experiment" == "$EXPERIMENT" ]; then 
       if [ $biological_replicate == 1 ]; then 
         if [ $technical_replicate == 1 ]; then 
           if [ $read_number == 1 ]; then 
             ID_111= $file_ID 
             fastq_111= $fastq_file 
             url_111= $url 
             echo "FASTQ file 111 ID: $ID_111" 
             echo "FASTQ file 111: $fastq_111" 
             echo "FASTQ file 111 url: $url_111" 
           elif [ $read_number == 2 ]; then 
             ID_112= $file_ID 
             fastq_112= $fastq_file 
             url_112= $url 
             echo "FASTQ file 112 ID: $ID_112" 
             echo "FASTQ file 112: $fastq_112" 
             echo "FASTQ file 112 url: $url_112" 
           fi 
         elif [ $technical_replicate == 2 ]; then 
           if [ $read_number == 1 ]; then 
             ID_121= $file_ID 
             fastq_121= $fastq_file 
             url_121= $url 
             echo "FASTQ file 121 ID: $ID_121" 
             echo "FASTQ file 121: $fastq_121" 
             echo "FASTQ file 121 url: $url_121" 
           elif [ $read_number == 2 ]; then 
             ID_122= $file_ID 
             fastq_122= $fastq_file 
             url_122= $url 
             echo "FASTQ file 122 ID: $ID_122" 
             echo "FASTQ file 122: $fastq_122" 
             echo "FASTQ file 122 url: $url_122" 
           fi 
       elif [ $biological_replicate == 2 ]; then 
         if [ $technical_replicate == 1 ]; then 
           if [ $read_number == 1 ]; then 
             ID_211= $file_ID 
             fastq_211= $fastq_file 
             url_211= $url 
             echo "FASTQ file 211 ID: $ID_211" 
             echo "FASTQ file 211: $fastq_211" 
             echo "FASTQ file 211 url: $url_211" 
           elif [ $read_number == 2 ]; then 
             ID_212= $file_ID 
             fastq_212= $fastq_file 
             url_212= $url 
             echo "FASTQ file 212 ID: $ID_212" 
             echo "FASTQ file 212: $fastq_212" 
             echo "FASTQ file 212 url: $url_212" 
           fi 
         elif [ $technical_replicate == 2 ]; then 
           if [ $read_number == 1 ]; then 
             ID_221= $file_ID 
             fastq_221= $fastq_file 
             url_221= $url 
             echo "FASTQ file 221 ID: $ID_221" 
             echo "FASTQ file 221: $fastq_221" 
             echo "FASTQ file 221 url: $url_221" 

           elif [ $read_number == 2 ]; then 
             ID_222= $file_ID 
             fastq_222= $fastq_file 
             url_222= $url 
             echo "FASTQ file 222 ID: $ID_222" 
             echo "FASTQ file 222: $fastq_222" 
             echo "FASTQ file 222 url: $url_222" 

           fi 
         fi 
       fi 
     fi 
done < test_file_database.txt 

请让我知道,如果我得到任何澄清。

+0

后循环的肉。你可能有一些未封闭的嵌套构造或不平衡的parens或东西。 –

+1

我在您发布的代码中看不到任何错误。创建一个再现问题的最小示例,并将* exact *代码复制并粘贴到您的问题中。 (您可能会在缩小测试用例的同时自己解决问题;在这种情况下,您可以删除问题或发布答案,具体取决于其他用户是否有用。) –

+0

您发布的代码显然适用于-is –

回答

0

$biological_replicate == 1接近顶端之后,if [ $technical_replicate == 1 ]; thenelif之后没有fi。见下文。

我想你可能会对indirect expansion感兴趣,如下所示。 (可能是笨拙;我是最近才发现自己间接扩展)。

this_id="${biological_replicate}${technical_replicate}${read_number}" # e.g., 111, 112, ... 
declare "ID_${this_id}"=$file_id # evaluates the left side into, e.g., ID_111, and sets $ID_111=$file_id 

我觉得这颇有几分可以减少你if链。从上面


编辑的代码:

while IFS= read -r line; do 
    echo $file_ID $experiment $target $biological_replicate $technical_replicate $read_number $url $fastq_file $genome 
    if [ "$experiment" == "$EXPERIMENT" ]; then 
      if [ $biological_replicate == 1 ]; then 
        if [ $technical_replicate == 1 ]; then 
          if [ $read_number == 1 ]; then 
            ID_111= $file_ID 
            fastq_111= $fastq_file 
            url_111= $url 
            echo "FASTQ file 111 ID: $ID_111" 
            echo "FASTQ file 111: $fastq_111" 
            echo "FASTQ file 111 url: $url_111" 
          elif [ $read_number == 2 ]; then 
            ID_112= $file_ID 
            fastq_112= $fastq_file 
            url_112= $url 
            echo "FASTQ file 112 ID: $ID_112" 
            echo "FASTQ file 112: $fastq_112" 
            echo "FASTQ file 112 url: $url_112" 
          fi 
        elif [ $technical_replicate == 2 ]; then 
          if [ $read_number == 1 ]; then 
            ID_121= $file_ID 
            fastq_121= $fastq_file 
            url_121= $url 
            echo "FASTQ file 121 ID: $ID_121" 
            echo "FASTQ file 121: $fastq_121" 
            echo "FASTQ file 121 url: $url_121" 
          elif [ $read_number == 2 ]; then 
            ID_122= $file_ID 
            fastq_122= $fastq_file 
            url_122= $url 
            echo "FASTQ file 122 ID: $ID_122" 
            echo "FASTQ file 122: $fastq_122" 
            echo "FASTQ file 122 url: $url_122" 
          fi 
        fi # <----- this one was missing 
      elif [ $biological_replicate == 2 ]; then 
      ... 
+0

你是对的,非常感谢你! – arielle

+0

@arielle很高兴帮助!欢迎来到本网站 - 不要忘记查看[tour](https://stackoverflow.com/tour)了解更多关于提问的问题。将吸引高质量的答案,另请参阅我添加到此答案的替代方案 – cxw

+1

感谢您的提示!我将研究间接扩展,并使用我的代码进行试用。 – arielle

相关问题