我有一个脚本,根据文件类型在我的下载目录中组织文件。
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
时,不使用变量,就会出现感叹号。
我尝试过多种方式改变事物;使用单引号,双引号,无引号,别名等,似乎没有任何作用。如果有人可以提供帮助,那就太棒了。
答案 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