Подстановочный знак для пути к местоположению на удаленном хосте

В Bash мне нужно проверить, указывает ли путь, содержащийся в строке, на удаленное местоположение или нет. Не работает следующее: some code не выполняется. Кажется, что я что-то пропустил о том, как маскировки работают с командой test ( [ ), но я не могу понять, что. Страница руководства мне не помогает. Что я делаю неправильно и как я должен идти об этом вместо этого?

 path="user@host:/home/user" if [ "$path" == ?*"@"?*":"?* ]; then some code fi 

One Solution collect form web for “Подстановочный знак для пути к местоположению на удаленном хосте”

Команда [ command] является командой и анализируется как любая другая команда. Это означает, что в:

 [ "$path" == ?*"@"?*":"?* ] 

« ?*"@"?*":"?* Принимается за глобус, поэтому он будет расширяться до списка файлов в текущем каталоге, который соответствует этому шаблону (так же, как *.txt расширяется до списка файлов txt в текущей каталог).

Даже если вы написали это:

 [ "$path" == '?*@?*:?*' ] 

для предотвращения глобуса, который не будет работать как оператор == (нестандартная версия = ) команды [ command] – это просто оператор равенства строк, а не соответствующий шаблону.

Чтобы выполнить сопоставление с образцами, вы можете использовать ksh стиль [[ x = pattern ]] оператор сопоставления шаблонов, который также поддерживает bash и zsh :

 path="user@host:/home/user" if [[ "$path" = ?*@?*:* ]]; then some code fi 

Или еще лучше, используйте конструкцию POSIX / Bourne sh :

 case $path in ?*@?*:*) some code esac 

Таким образом, вам даже не нужно устанавливать bash , вы можете использовать стандартную sh для интерпретации вашего сценария.

Обратите внимание, что user@host:/home/user также является допустимым локальным путем (попробуйте mkdir -p user@host:/home/user ), хотя с помощью scp вам нужно передать его как ./user@host:/home/user чтобы он не рассматривался как удаленный путь. Поэтому вы можете уточнить свой тест:

 case ${path%%@?*:*} in (*/* | "$path" | "") echo not a remote path;; (*) echo remote path;; esac 

Так что ./x@y:z не обрабатывается как удаленный путь.

Этого еще недостаточно, чтобы сделать то же самое, что и scp , чтобы решить, удалён или нет путь. Если посмотреть на scp код OpenSSH , путь будет удален, если он не начнется с : и если он содержит : с отсутствием / слева от него и который не находится внутри [...] (для адресов IPv6, таких как [::1] исключением того, что те [...] рассматриваются только в позиции хоста (в начале или после @ ). Так, например, x: @: – это удаленные пути (хотя, очевидно, пользователь и хост-часть пустые, вероятно, не будет работать должным образом) и user@[::1/64]:/x ( / left to : не находится между [...] ) или [foo@bar:/path – это локальные пути ( : находится внутри [...] ).

Согласование этого с одним заявлением case POSIX было бы невозможным. Чтобы соответствовать одному регулярному выражению, было бы немного легче с регулярными выражениями, которые поддерживают внешний вид операторов, таких как perl . zsh и ksh93 поддерживают те ( zsh используя библиотеку PCRE, ksh93 используя собственную реализацию).

  • zsh :

     set -o rematchpcre remote='^(?!:)(?:(?!\[)[^/:]*@)?(?:\[(?:(?!]:)[^/])*\]|(?!\[)[^/:]*):' if [[ $path =~ $remote ]]; then some code fi 
  • ksh93 :

     remote='(?P:^(?!:)(?:(?!\[)[^/:]*@)?(?:\[(?:(?!]:)[^/])*\]|(?!\[)[^/:]*):)' if [[ $path =~ $remote ]]; then some code fi 

(Я не удивлюсь, если это будет упрощено).

  • Как включить табуляцию подстановочных знаков в bash?
  • «Который» с небольшим «grep» -подобным решением?
  • Изменение шаблонов гвоздики zsh для использования с cp
  • Bash Globbing не так, как ожидалось
  • команда find: -или опция не работает
  • История Бэша
  • Как просмотреть последние 5 строк из последнего созданного / измененного файла?
  • Как я могу использовать `find` с` -pattern`, а также ограничивать глубину?
  • echo показывает 1 4 5 6 ... почему?
  • Проверьте, есть ли файлы, соответствующие шаблону, чтобы выполнить скрипт
  • Найти файлы, которые заканчиваются номером
  • Как мы укажем несколько шаблонов игнорирования для команды «tree»?
  • Interesting Posts

    Рекомендации по написанию дисков Blu-Ray на Linux

    Как написать скрипт, который откроет несколько вкладок в терминале?

    результат фильтрации команды ls для получения только определенных имен файлов на основе формата

    Преобразование даты в эпоху из результата команды в человекообразное

    Как подождать фоновые задания в фоновом режиме?

    Splashscreen для встроенных Linux

    Python не может импортировать winregistry

    Генерация ключей gpg на Cails live cd – почему так быстро?

    Cron vs systemd таймеры

    Поиск процессов, вызывающих работу вентиляторов

    Как перейти из CentOS в RHEL?

    Как ssh в удаленном ящике, запустите команду и продолжайте ее работу после отключения

    Как считывать неиспользуемые последовательные контакты (RTS, CTS и т. Д.)?

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

    Почему blkid отображает другой UUID, чем / dev / disk / by-uuid для моего USB-накопителя

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