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

How to pass multiple arguments with pipe symbol into a bash-script's case statement

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

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

我的下载目录中只有一个 .png 文件,没有其他文件。
当我调用moveto "png"时,出现感叹号
当我调用moveto "png|jpg"时,感叹号没有出现。
当我在 case 语句中简单地键入 png|jpg 时,不使用任何变量,就会出现感叹号。

我尝试过多种方式来改变现状;使用单引号、双引号、无引号、别名等,似乎都不起作用。如果有人能帮忙就太好了。

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

您可以通过启用扩展 globs (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

如果你想变得花哨,你可以 assemble 自己制作图案:

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

moveto png jpg