如何将带有管道符号的多个参数传递到 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
我有一个脚本可以根据文件类型在我的下载目录中组织文件。
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