Как обрабатывать пробелы в именах путей, когда переменная содержит несколько путей

Хотя я прочитал большинство вопросов о обработке пробелов в именах путей, я еще не нашел своего случая, и это касается нескольких имен путей в одной переменной.

find понадобится, когда будут заданы два базовых пути, например:

 pa="/home/user/folder1 /home/user/folder2" find $pa -name '*xy*' ... 

Это будет искать совпадения как в folder1 и в folder2 .

(Обратите внимание, что это упрощенный пример, я очень хорошо знаю, что в этом специальном случае вы можете использовать модификатор -path с параметром, например folder* который охватывает обе папки. Однако этот вопрос должен охватывать случаи, когда вы не можете работать вокруг проблемы так легко из-за более высокой сложности.)


Теперь представьте, что folder2 содержит пространство посередине. Следующие действия не будут работать:

 pa="/home/user/folder1 /home/user/fol\ der2" find $pa -name '*xy*' ... 

Проблема заключается в том, что \ , который обычно используется для представления пространства в оболочке, но не будет работать, если содержимое переменной заключено в двойные кавычки. Однако, в отличие от одного пути на переменную (где это может сделать трюк), следующее не будет работать:

 pa=/home/user/folder1 /home/user/fol\ der2 find $pa -name '*xy*' ... 

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

и не будет следующий вариант:

 pa=/home/user/folder1 /home/user/fol\ der2 find "$pa" -name '*xy*' ... 

Итак, как можно корректно обрабатывать пробелы в путях, если несколько путей содержатся в одной переменной?

Связанный вопрос: существует ли какой-либо надежный способ определить, является ли пробел разделителем между одним путем и его преемником (внутри одной и той же переменной) или пробелом, принадлежащим одному из путей, содержащихся внутри?

2 Solutions collect form web for “Как обрабатывать пробелы в именах путей, когда переменная содержит несколько путей”

Использовать массивы bash :

 pa=("/home/user/folder1" "/home/user/fol der2") find "${pa[@]}" -name '*xy*' ... 

обсуждение

Обратите внимание, что \ не делает того, что надеется:

 $ pa="/home/user/folder1 /home/user/fol\ der2" $ printf '%s\n' $pa /home/user/folder1 /home/user/fol\ der2 

\ В определении pa становится буквальным символом в строке, а не побегом. Если вам нужен список отдельных строк, используйте массив.

Используйте переменную массива и поместите одно значение пути в каждый элемент массива. Если это действительно невозможно, другим подходом было бы использование чего-то другого, кроме пространства, в качестве разделителя элементов.

 p[0]="hello" p[1]="happy" p[2]="world" echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}" for p in "${p[@]}" do echo "p=$p." done 

И т.п.

  • Перейдите в каталог, содержащий пробел
  • Как автоматически снимать конечные пробелы при сохранении в Vi и Vim?
  • Трейлинг пространства при копировании из gnome-терминала с использованием zsh
  • Как я могу отредактировать мой скрипт bash для учета пробелов?
  • shell для цикла с поиском с именами файлов, содержащими пробелы
  • Почему vim сбрасывается в одно и то же положение после нескольких пробелов?
  • Linux и Unix - лучшая ОС в мире.