首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash函数将不接受解析的最后两个参数。

bash函数将不接受解析的最后两个参数。
EN

Stack Overflow用户
提问于 2015-05-13 02:13:20
回答 1查看 106关注 0票数 2

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

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

“守则”:

代码语言:javascript
复制
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}

我没有打印出所有参数,而是得到以下内容:

代码语言:javascript
复制
$> ./exonTables_recoverLostReads.bsh
Scaffold10026 154793 6043 . 1 6043 93
40
10
/filepath/Renamed_pmin.scaf.fa
/filepath/SRR573675.realigned.bam
/filepath/SRR573705.realigned.bam
/filepath/SRR573706.realigned.bam
/filepath/SRR573707.realigned.bam
/filepath/SRR573708.realigned.bam
Scaffold10026 154793 6043 . 1 6043 930
Scaffold10026 154793 6043 . 1 6043 931

最后两个参数怎么了?

输入文件的前几行也是这样(我构建的代码不解析头行):

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 02:23:10

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

为了避免歧义,Bash变量可以随意地被{}包围,这是有必要的情况之一。

然而,还有另一种惯用的(和IMO清洁剂)方法来处理这个问题。将参数变量重新分配到命名变量,如下所示:

代码语言:javascript
复制
function exon_parse {
    data=$1;shift
    Av_Cov_Min=$1;shift
    Min_SNPs=$1;shift
    ....

shift内置导致$1的内容被删除,$2的内容被“向下移动”到$1中;$3和所有其他参数也被向下移动。

这允许您访问所有参数,而不引用任何高于$1的位置变量,从而完全避免了这个问题。当然,这不是必要的,但是我发现忘记和意外地输入$11而不是${11}太容易了。每次换班,我都不需要担心。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30204495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档