gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:43:28 24 4
gpt4 key购买 nike

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

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 时,没有使用任何变量,感叹号出现了。

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

最佳答案

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

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

moveto "@(png|jpg)"

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

* 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 脚本的 case 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28017241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com