Согласование шаблонов с входными аргументами

Мы пытаемся усовершенствовать один из наших скриптов.

Пользователи передадут некоторые аргументы, и часть аргументов будет иметь 5.0.3 . Например, входной аргумент будет похож на Jboss5.0.3GA . Так как у него (Jboss5.0.3GA) есть «5.0.3», мы попытаемся найти установочный двоичный файл «Jboss5.0.3GA.tar».

Текущий скрипт, который мы имеем сейчас, является скриптом ksh. Я пытаюсь использовать условие if со сценарием.

Примеры использования и результаты:

 ./test.sh Jboss5.0.3GA Match found... we'll try to locate the installation binary ./test.sh Jboss5.0.3 Match found... we'll try to locate the installation binary ./test.sh 5.0.3 Match found... we'll try to locate the installation binary ./test.sh Jboss5.1.3 No Match found ... we'll be exiting the script. 

  • Использование Diff в определенном столбце в файле
  • Как я могу пропустить пустые файлы с sed?
  • Как печатать слева и справа от уже напечатанного вывода
  • Тайм-аут оболочки Korn
  • Где $ _ определяется POSIX?
  • Является ли «Арифметическое расширение» ожидаемым действием на vars внутри `[[` tests?
  • Как отсортировать имена файлов, показанные в команде grep, на основе метки времени?
  • -ksh: income_ext.ksh: не найден
  • 2 Solutions collect form web for “Согласование шаблонов с входными аргументами”

    Согласование шаблонов в оболочках POSIX выполняется с помощью конструкции case . ksh также является оператором [[ x = pattern ]] (также скопированным bash и zsh ) и [[ x =~ regexp ]] в последних версиях.

    Так:

     case $1 in (*5.0.3*) install=$1.tar echo Found;; (*) echo >&2 Not found exit 1;; esac 

    Я не эксперт в регулярных выражениях, но это работает, по крайней мере, для того, что вы описали.

     #!/bin/sh argument="$1" #if [[ $argument =~ [a-zA-Z]*5\.0\.3[a-zA-Z]+ ]]; then# only works on bash if echo $argument | egrep -q '[a-zA-Z]*5\.0\.3[a-zA-Z]+'; then #echo "Found: ${BASH_REMATCH[0]}" # for bash echo "Match Found" # you can check for $argument at some other location, here. else echo "No match" fi 

    Сохраняя его в качестве test и запуская его, вы получаете следующие результаты:

     bash test 333xxxx5.0.3xxxxx777 Match Found bash test 333xxxx5.0.2xxxxx777 No match bash test 5.0.3xxxxx777 Match Found bash test 5.0.2xxxxx777 No match 

    Вы можете добавить ^ в начале и $ в конце, чтобы соответствовать полной строке или ничто. Подобно этому ^[a-zA-Z]*5\.0\.3[a-zA-Z]+$

    Interesting Posts

    Где scp помещал эти файлы?

    Любой инструмент для сохранения символических ссылок?

    Найти и заменить слова в текстовом файле рекурсивно

    Добавление текста в конец текстового файла

    Почему «Выполнение выхода 130 – это не то же самое, что умирать от SIGINT»?

    Невозможно заставить YouCompleteMe функционировать

    Как вырастить файловую систему для использования нераспределенного пространства в разделе?

    Samba 4.1.9 возвращает «доступ запрещен», пытающийся изменить share perms от клиента Win

    Метод поиска каталога GNU texinfo?

    Простейшая возможная защищенная песочница (необходимы ограниченные ресурсы)

    Найти файлы с расширениями, заданными в аргументах с помощью regex

    Rfkill отказывается разблокировать WiFi-устройство

    Самое быстрое копирование файлов в каталоге sshfs (rsync?)

    Как объединить wget, сортировать и сохранять в новое имя файла?

    хром (хром) не загружается домашняя страница автоматически

    Linux и Unix - лучшая ОС в мире.