如何将带有管道符号的多个参数传递到bash脚本案例语句中

Posted

技术标签:

【中文标题】如何将带有管道符号的多个参数传递到bash脚本案例语句中【英文标题】:How to pass multiple arguments with pipe symbol into a bash-script's case statement 【发布时间】:2015-03-17 00:32:17 【问题描述】:

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

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】:

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

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

moveto "@(png|jpg)"

扩展的全局模式记录在bash manual;它们由以下字符之一组成:*+?@! kbd> 后跟由 | 分隔的带括号的模式列表。最初的字符含义大多是熟悉的:

* 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

【讨论】:

以上是关于如何将带有管道符号的多个参数传递到bash脚本案例语句中的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代 Bash 脚本中的参数

如何将参数从 bash 传递到 php 脚本?

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

如何在bash脚本中传递两个参数或参数[重复]

如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]

我如何使用bash将带有参数*的函数输出分配给变量?