Как передать несколько аргументов с символом канала в оператор 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
Другие вопросы по тегам