首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用程序时,变量中的bash存储程序参数不起作用

在调用程序时,变量中的bash存储程序参数不起作用
EN

Stack Overflow用户
提问于 2017-03-08 15:08:55
回答 1查看 14关注 0票数 1

我想在我的bash_profile中编写一个函数来记录一些用于执行程序的参数。问题是,当我将参数存储在变量中时,当我调用程序时会出现错误。

代码语言:javascript
复制
#!/bin/bash

para="-db ~/Desktop/search_for_TDS/claClusterSeq -query ~/path/to/file/abc -out ~/Desktop/hallo_blast123"

/home/xyz/blastn $para

这会产生一个错误:

代码语言:javascript
复制
Command line argument error: Argument "query". File is not accessible:  `~/path/to/file/abc'

虽然这样做是不行的:

代码语言:javascript
复制
#!/bin/bash

/home/xyz/blastn -db ~/Desktop/search_for_TDS/claClusterSeq -query ~/path/to/file/abc -out ~/Desktop/hallo_blast123

两次都是在Ubuntu16.04LTS上调用bash test.sh进行测试。

如果感兴趣的话,下面是我想要的bash_profile中的实际函数:

代码语言:javascript
复制
blastv25table(){

    if [[ ! $# = 5 ]];   then

        echo "Param: query db wordSize task evalue"

    else

        #== Parameters ==

        DATE=$(date -I)

        para="-num_threads 8
         -query $1
         -db $2
         -outfmt 6
         -task $4
         -word_size $3
         -out $PWD/"$1"_"$4"_ws_"$3"_eval_"$5"_Result_"$DATE"_table
         -evalue $5
         "

        #== Parameter logfile ==

        log="./blast_param.log"

        echo -e 'Timestamp\t: '$(date)'\nQuery file\t: '$1'\nDB file\t\t: '$2'\nParameters\t: '$para'\nBlastn\t\t: v2.5\n\n##---------------------------##\n' >> $log


        #======= Start Blastn ======

        /home/xyz/blastn $para

    fi
}

首先导致测试的错误是由以下原因引起的:

-out $PWD/"$1"_"$4"_ws_"$3"_eval_"$5"_Result_"$DATE"_table

其中,我希望使用调用脚本的目录,以便在blastn的输出参数中使用该目录。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-08 15:18:02

从您的简短示例来看,倾斜体不会在引用的字符串中展开。

您希望使用数组变量,而不是将所有选项推入单个字符串:

代码语言:javascript
复制
blastv25table() {
    if [[ $# -ne 5 ]];   then
        echo "Param: query db wordSize task evalue"
    else
        date=$(date -I)
        para=(
         -num_threads 8
         -query "$1"
         -db "$2"
         -outfmt 6
         -task "$4"
         -word_size "$3"
         -out "$PWD/${1}_${4}_ws_${3}_eval_${5}_Result_${date}_table"
         -evalue "$5"
        )
        log="./blast_param.log"

        printf 'Timestamp\t: %s\nQuery file\t: %s\nDB file\t\t: %s\nParameters\t: %s\nBlastn\t\t: v2.5\n\n##---------------------------##\n' \
          "$(date)" "$1" "$2" "${para[*]}" >> $log

        /home/xyz/blastn "${para[@]}"
    fi
}

如果希望输出文件与blastn程序位于同一个目录中,请执行以下操作:

代码语言:javascript
复制
#!/bin/bash
blast_dir=$(dirname "$0")
...
blastv25table() {
    ...
         -out "$blast_dir/${1}_${4}_ws_${3}_eval_${5}_Result_${date}_table"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42674928

复制
相关文章

相似问题

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