Почему это регулярное выражение не работает?

Я хочу посмотреть на вывод git status -s чтобы определить, есть ли в дереве какие-либо необработанные файлы. Я пробовал следующий тест, но регулярное выражение не совпадает. Почему нет?

 $ git status -s ## master M updated-file ?? new-file $ [[ $(git status -s) =~ ^\?\? ]] || echo "no match" no match 

Я также хотел бы иметь возможность протестировать добавленные / измененные / удаленные файлы таким же образом. Обычно для этого я использую что-то вроде ^\s*[AMD] , но это тоже не работает. Что дает?

  • Как переименовать шаблон в один файл в другой по нескольким каталогам рекурсивно
  • В терминале Linux существует разница между «bash foo.sh» и «./foo.sh»,
  • невозможно извлечь файл, который загружается на FTP-сервер
  • Как я могу перечислять скрытые каталоги, затем каталоги, затем скрытые файлы и, наконец, файлы с ls?
  • Shell отключается при арифметическом выражении в цикле
  • Помогите тестировать специальный файл в `/ sys / class / net /`
  • Почему я не могу выполнить процесс?
  • Может кто-нибудь уточнить этот сценарий Bash
  • One Solution collect form web for “Почему это регулярное выражение не работает?”

    Вы сопоставляетесь со всей строкой, а не с каждой строкой строки, поэтому вы действительно проверяете против ## в этом регулярном выражении.

    grep – лучший выбор для этого:

     if ! git status -s | grep -q '^??'; then echo "no match" fi 

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

     git status -s | grep '^ *[AMD]' 

    Вы также можете посмотреть в git status --porcelain (вариант, который впервые появился в версии 1.7.0), который больше ориентирован на разбор.

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