如何将带有管道符号的多个参数传递给bash-script case语句

时间:2015-01-19 02:44:22

标签: bash escaping command-line-arguments argument-passing

我有一个脚本,根据文件类型在我的下载目录中组织文件。

function moveto {
    for filename in *
    do
    case "${filename##*.}" in
        $1 ) echo "!";; # echo statement for debugging
    esac
    done
}

我的下载目录中有一个.png文件,没有别的。
当我拨打moveto "png"时,会出现感叹号 当我拨打moveto "png|jpg"时,会出现感叹号 当我只是在case语句中输入png|jpg时,不使用变量,就会出现感叹号。

我尝试过多种方式改变事物;使用单引号,双引号,无引号,别名等,似乎没有任何作用。如果有人可以提供帮助,那就太棒了。

1 个答案:

答案 0 :(得分:5)

case语句中的 | 是case语句的语法的一部分,因此它必须是源代码的一部分。 (终止模式列表的也是如此。)

您可以通过启用扩展的全局(shopt -s extglob)然后使用一个来获得所需的效果:

moveto "@(png|jpg)"

bash manual中记录了扩展的glob模式;它们包含一个字符 * + @ 后跟由 | 分隔的带括号的模式列表。最初的字符意义大多是熟悉的:

* zero or more repetitions of any of the patterns
+ one or more repetitions of any of the patterns
? nothing or exactly one of the patterns
@ exactly one of the patterns
! does not match any of the patterns

如果你想获得幻想,你可以自己组装模式:

moveto() {
  local pattern="@($(tr ' ' '|'<<<"$*"))"
  local filename
  for filename in *; do
    case "${filename##*.}" in
      $pattern) echo "!";; # echo statement for debugging
    esac
  done
}

moveto png jpg