我有一个文件列表:
path/dir/*.gz
我想提供此文件列表作为bash脚本中的输入,以及与分析有关的其他参数(即输出文件夹和线程数)。
./myscript.sh path/dir/*.gz output_path 2
myscript.sh包含以下命令:
fastqc $1 -o $2 -t $3 --noextract -d ./
fastqc程序能够在多个线程上运行输入文件列表。 我在SGE群集中使用此脚本,因此使用命令“ qsub”。 我以以下方式运行它:
qsub ./myscript.sh path/dir/*.gz output_path 2
但是,它不起作用。有人知道为什么,可以提出解决方案吗? 我的理解是,我搞砸了输入文件列表作为参数。
答案 0 :(得分:1)
您的问题是,在脚本启动前,外壳程序会将通配符扩展为单个文件名。
以下是一些策略:
从列表中选择最后2个参数:
#!/bin/bash
if (( $# < 3 )); then
echo not enough arguments
exit 1
fi
# threads is the last argument
n=$#
threads=${!n}
# output_path is the 2nd-last argument
((n--))
output_path=${!n}
# discard the last 2 arguments
((n--))
set -- "${@:1:n}"
# now "$@" is the list of input files.
for file in "$@"; do
fastqc "$file" -o "$output_path" -t "$threads" --noextract -d ./
done
这使用“间接变量”(${!n}
)提取数字$ n的位置参数值。
使用命令行选项提供输出路径和线程数:
#!/bin/bash
while getopts :o:t:h opt; do
case $opt in
h) show_help; exit ;;
o) output_path=$OPTARG ;;
t) threads=$OPTARG ;;
*) exit ;; # some error
esac
done
if [[ -z $output_path ]]; then
echo error message
exit 1
fi
if [[ -z $threads ]]; then
echo error message
exit 1
fi
# other validations, like $threads is a sensible whole number
shift $((OPTIND - 1))
# now "$@" is the list of input files.
for file in "$@"; do
fastqc "$file" -o "$output_path" -t "$threads" --noextract -d ./
done
我不知道fastqc
,但是如果它可以接收多个输入文件,那么请执行循环操作而不是循环操作
fastqc "$@" -o "$output_path" -t "$threads" --noextract -d ./