Это упрощенный пример, который, надеюсь, иллюстрирует мою проблему.File globbing без разделения слов?
У меня есть сценарий, который принимает параметр, который будет использоваться в качестве подстановочного знака. Иногда этот шаблон содержит пробелы. Мне нужно иметь возможность использовать подстановочный знак для globbing, но расщепление слов приводит к сбою.
Например, рассмотрим следующий пример файла:
$ ls -l "/home/me/dir with whitespace"
total 0
-rw-r--r-- 1 me Domain Users 0 Jun 25 16:58 file_a.txt
-rw-r--r-- 1 me Domain Users 0 Jun 25 16:58 file_b.txt
Мой сценарий - упрощена, чтобы использовать жесткий кодированный переменную шаблона - выглядит следующим образом:
#!/bin/bash
# Here this is hard coded, but normally it would be passed via parameter
# For example: pattern="${1}"
# The whitespace and wildcard can appear anywhere in the pattern
pattern="/home/me/dir with whitespace/file_*.txt"
# First attempt: without quoting
ls -l ${pattern}
# Result: word splitting AND globbing
# ls: cannot access /home/me/dir: No such file or directory
# ls: cannot access with: No such file or directory
# ls: cannot access whitespace/file_*.txt: No such file or directory
####################
# Second attempt: with quoting
ls -l "${pattern}"
# Result: no word splitting, no globbing
# ls: cannot access /home/me/dir with whitespace/file_*.txt: No such file or directory
Есть ли способ включить глобирование , но отключить разбиение слов?
Есть ли у меня какие-либо опции, кроме того, что я вручную удалял пробелы в моем шаблоне?
Как насчет того, чтобы избежать пробелов? 'pattern =" $ {pattern ///\\} '. Вам нужно будет избегать других значимых символов (например,'; '), поэтому я не рекомендую это самостоятельно! –
Is' ''$ {pattern // \ */\ '* \'} '"любая помощь? Одиночная кавычка всей строки, а затем замените' * 'на' '*'', чтобы вернуть их за строку. Возможно, нужно сделать то же самое с '? 'тоже. –
@TobySpeight - я попытался избежать пробелов. Он по-прежнему становится жертвой расщепления слов, потому что' \\ 'воспринимается буквально потому, что находится внутри переменной. Второе предложение не срабатывало, поскольку оно принимает' ''буквально. –