文件列表作为bash脚本的输入参数

时间:2018-09-10 19:07:16

标签: bash list cluster-computing

我有一个文件列表:

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

但是,它不起作用。有人知道为什么,可以提出解决方案吗? 我的理解是,我搞砸了输入文件列表作为参数。

1 个答案:

答案 0 :(得分:1)

您的问题是,在脚本启动前,外壳程序会将通配符扩展为单个文件名。

以下是一些策略:

  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的位置参数值。

  2. 使用命令行选项提供输出路径和线程数:

    #!/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 ./