Как передать несколько аргументов с символом канала в оператор case bash-скрипта
У меня есть скрипт, который организует файлы в моем каталоге загрузок в соответствии с их типом файла.
function moveto {
for filename in *
do
case "${filename##*.}" in
$1 ) echo "!";; # echo statement for debugging
esac
done
}
У меня есть файл.png в моем каталоге загрузок и больше ничего.
Когда я звоню moveto "png"
появляется восклицательный знак.
Когда я звоню moveto "png|jpg"
восклицательный знак не появляется.
Когда я просто набираю png|jpg
в регистр, без переменных, появляется восклицательный знак.
Я пытался изменить вещи более чем несколькими способами; используя одинарные кавычки, двойные кавычки, без кавычек, псевдонимов и т. д., кажется, ничего не работает. Было бы здорово, если бы кто-то мог помочь.
1 ответ
| в case
оператор является частью синтаксиса оператора case, поэтому он должен быть частью исходного кода. (То же самое относится и к завершению списка шаблонов.)
Вы можете получить желаемый эффект, включив расширенные глобусы (shopt -s extglob
) а затем с помощью одного:
moveto "@(png|jpg)"
Расширенные шаблоны глобусов описаны в руководстве по bash; они состоят из одного из символов *, + ,?, @ или ! сопровождаемый заключенным в скобки списком образцов, разделенных |, Начальные значения символов в основном знакомы:
* 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