String bash函数不会接受解析到它的最后两个参数

String bash函数不会接受解析到它的最后两个参数,string,bash,function,parsing,String,Bash,Function,Parsing,我试图通过一个函数传递数据文件的每一行。除了文件中的数据外,函数中还解析了许多其他参数。对于每一行,总共解析11个参数。由于某些原因,函数会忽略最后两个参数 下面是我的代码,以及输入数据的示例和运行代码的结果。有什么建议吗 守则: function exon_parse { data=$1 CHROM=$(awk ' {print $1}' <<< $data ) CHROM_LENGTH=$(awk ' {print $2}' <<<

我试图通过一个函数传递数据文件的每一行。除了文件中的数据外,函数中还解析了许多其他参数。对于每一行,总共解析11个参数。由于某些原因,函数会忽略最后两个参数

下面是我的代码,以及输入数据的示例和运行代码的结果。有什么建议吗

守则:

function exon_parse {
    data=$1
    CHROM=$(awk ' {print $1}' <<< $data )
    CHROM_LENGTH=$(awk ' {print $2}' <<< $data )
    EXON_LENGTH=$(awk ' {print $3}' <<< $data )
    STRAND=$(awk ' {print $4}' <<< $data )
    START=$(awk ' {print $5}' <<< $data )
    STOP=$(awk ' {print $6}' <<< $data )
    POLY_SITES=$(awk ' {print $7}' <<< $data )
    Av_Cov_Min=$2
    Min_SNPs=$3
    REF=$4
    BAM1=$5
    BAM2=$6
    BAM3=$7
    BAM4=$8
    BAM4=$8
    BAM6=$10
    OUTPUT_FILE=$11
    echo $1
    echo $2
    echo $3
    echo $4
    echo $5
    echo $6
    echo $7
    echo $8
    echo $9
    echo $10
    echo $11
    exit 0
}
INPUT_FILE="/filepath/confused_reads.txt_"
OUTPUT_FILE="/filepath/filtered_recovered_reads.txt"
Av_Cov_Min=40
Min_SNPs=10
REF="/filepath/Renamed_pmin.scaf.fa"
BAM1="/filepath/SRR573675.realigned.bam"
BAM2="/filepath/SRR573705.realigned.bam"
BAM3="/filepathSRR573706.realigned.bam"
BAM4="/filepath/SRR573707.realigned.bam"
BAM5="/filepath/SRR573708.realigned.bam"
BAM6="/filepath/SRR573709.realigned.bam"
count=1
while read line; do
    if [[ $count == 1 ]]; then
        count=$(( count + 1 ))
    else
        data=$line
        exon_parse  "$data" $Av_Cov_Min $Min_SNPs $REF $BAM1 $BAM2 $BAM3 $BAM4 $BAM5 $BAM6 $OUTPUT_FILE 
    fi

done < ${INPUT_FILE}
最后两个参数发生了什么变化

输入文件的前几行是这样的(我构建了我的代码,这样它就不会解析头行):


尝试改用
${10}
${11}

Bash变量可以有选择地用
{}
包围,以避免歧义,这是必要的情况之一

然而,还有另一种惯用的(而且更干净)方法来处理这个问题。将参数变量重新指定给命名变量,如下所示:

function exon_parse {
    data=$1;shift
    Av_Cov_Min=$1;shift
    Min_SNPs=$1;shift
    ....
shift
内置导致
$1
的内容被删除,
$2
的内容被“下移”到
$1
<代码>$3和所有其他参数也下移


这允许您访问所有参数,而无需引用任何高于
$1
的位置变量,从而完全避免了此问题。当然,这是不必要的,但我发现它很容易忘记并意外地键入
$11
,而不是
${11}
。通过不断变换,我永远不必担心这一点。

Ooof。不要像那样使用
awk
来解析第一个参数。使用shell内置的
read
拆分行并将片段分配给各种变量。在这种情况下,我使用awk计算效率很低?非常低。你正在为每个作业开始一个新的过程。我不会说像这样不必要地使用
shift
更惯用。嗯,至少这是我的惯用用法。它确实需要更高级的参数处理,例如在处理开关和/或可选参数时,我认为它是“防御性编码”,以避免OP所犯的错误。哦,是的,<代码>移位< /代码>对于以非均匀的方式迭代参数非常有用,例如解析一系列选项,其中一些可能需要一个或多个参数本身。不过,在这种情况下,一个固定大小和已知顺序的简单序列,只使用编号的参数就更简单了。我突然想到,壳牌可能会将10美元和11美元解释为1+“0”和1+“1”。看起来很明显,回顾过去,这是一个很容易犯的错误,即使你知道要检查它!
scaffold    scaff_length    exon_length strand  start   stop    total_polymorphic_sites
Scaffold10026   154793  6043    .   1   6043    93
Scaffold10026   154793  6043    .   1   6043    93
Scaffold10026   154793  6043    .   1   6043    93
Scaffold10575   154793  5235    .   22299   27533   103
Scaffold10575   154793  5235    .   22299   27533   103
function exon_parse {
    data=$1;shift
    Av_Cov_Min=$1;shift
    Min_SNPs=$1;shift
    ....