如何在bash脚本中使用带有getopts的通配符?

时间:2012-01-26 19:33:53

标签: bash getopts

我有一个bash脚本,我想要一些可选的输入参数,后跟文件名或包含通配符的文件规范。

如果我跑    getopts_problem.sh -td *.txt 该脚本愉快地输出当前目录中的.txt文件列表:

  

文件是readme.txt letter_to_editor.txt someotherfile.txt

如果我运行getopts_problem.sh -td *.ABC 脚本输出

  

文件是* .ABC

当前目录中没有扩展名为“.ABC”的文件。出于某种原因,脚本将“* .ABC”解释为文件名。如何让脚本将“* .ABC”识别为要扩展的文件名表达式,而不是实际的文件名?代码如下:

# !/bin/sh
doDry=0
doTimestamp=0

while getopts ":dt" OPT;
do
   case $OPT in
      d ) doDry=1 ;;
      t ) doTimestamp=1 ;;
      ? ) echo 'Bad options used. '
          exit 1 ;;
    esac
done

shift $(($OPTIND - 1))
fileList=$@

for file in "$fileList"
do
  echo file is $file
done

exit 0

1 个答案:

答案 0 :(得分:2)

在执行脚本之前,通配符模式会被bash扩展。不是解释脚本的shell,而是从中运行它的shell。它是否保持模式,不传递或失败取决于nullglobfailglob和一些此类选项(请参阅man bash)。

另外,在for file in "$fileList"引号中明确告诉shell 而不是扩展变量。