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

时间:2017-03-08 15:08:55

标签: bash variables parameters

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

#!/bin/bash

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

/home/xyz/blastn $para

这会产生错误:

Command line argument error: Argument "query". File is not accessible:  `~/path/to/file/abc'

虽然这不会:

#!/bin/bash

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

通过在Ubuntu 16.04 LTS上调用bash test.sh进行测试来执行这两次。

如果感兴趣,这是我在bash_profile中想要的实际功能:

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的输出参数中使用

1 个答案:

答案 0 :(得分:0)

从您的简短示例中,代字号 不会在带引号的字符串中展开。

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

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程序位于同一目录中,请执行以下操作:

#!/bin/bash
blast_dir=$(dirname "$0")
...
blastv25table() {
    ...
         -out "$blast_dir/${1}_${4}_ws_${3}_eval_${5}_Result_${date}_table"