如何将带有管道符号的多个参数传递到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脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]