解析命令行参数来处理bash中的文件列表?

时间:2015-05-29 16:52:22

标签: string bash list parsing

我想创建一个脚本,其中一些可选输入解析类似于this respone解释的方式,但也包含具有特定扩展名的文件列表。示例用法是

./myscript.sh -s 25 -q 0.2 *.txt

然后脚本将25存储到s变量中,0.2存储到q varable中,然后将单独处理所有txt文件的列表。这就是我到目前为止所拥有的

#!/bin/bash -f

# set the default values
QMAX=0.2
PROFILESIZE=50

while [[ $# > 0 ]]
do
key="$1"
case $key in
    -q|--max_q)
    QMAX="$2"
    shift # past argument
    ;;
    -s|--profile_size)
    PROFILESIZE="$2"
    shift # past argument
    ;;
esac
shift # past argument or value
done

for var in "$@"
do
    if [[ $var == *".txt" ]]
    then
        # do something on for real on each file here
        echo $QMAX $PROFILESIZE $var
    fi
done

按原样,我可以通过注释掉while循环来运行默认值。在没有注释的情况下,它会读取输入,并且没有剩余的for循环进行比较。我认为最好的选择是在while循环中创建文件列表,然后在for循环中使用它。关于我如何做到的任何想法?

3 个答案:

答案 0 :(得分:3)

只需追加一个*)案例,将参数存储到数组中。

*) files+=("$1") ;;

然后迭代文件而不是$@

for file in "${files[@]}" ; do

答案 1 :(得分:1)

您可以使用getopts命令处理可选参数,将剩余参数保留在$@中。

while getopts 's:q:' opt; do
    case $opt in
        s) PROFILESIZE=$OPTARG ;;
        q) QMAX=$OPTARG ;;
    esac
done
shift $(( OPTIND - 1 ))

然而,这确实有不支持长选项的缺点。

答案 2 :(得分:0)

第一个消息是不要从头开始实现它并使用" getopts / getopt"代替。但是,如果由于某种原因你可以,并且假设选项总是在参数之前:

#!/bin/bash 

# set the default values
QMAX=0.2
PROFILESIZE=50

while [[ $# > 0 ]]
do
 key="$1"
 case $key in
 -q|--max_q)
   QMAX="$2"
   shift 2 # past argument
  ;;
  -s|--profile_size)
    PROFILESIZE="$2"
    shift 2 # past argument
   ;;
  *)
   break
   ;;

# --) 
# break
# ;;

  esac
done

for var in "$@"
do
  if [[ $var == *".txt" ]]
  then
    # do something on for real on each file here
    echo $QMAX $PROFILESIZE $var
  fi
done