我想在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的输出参数中使用
答案 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"