Исключение пробелов в сценарии bash не работает
Ничего, что я пробовал, работает. Посмотрите на строки grep для массива в приведенном ниже скрипте. Сбежание, кажется, ничего не делает. Но если я создаю статически назначенный массив, все в порядке.
Такие как:
- `Синтаксическая ошибка:" ("неожиданно" при создании массива
- Копировать вывод curl в файл
- проблема с Else statment в Bash
- Цитирование файлов листинга в UNIX
- Shell Script: захватывать строку в середине текста, иногда в начале
files=(somefile.txt some\ other\ file.pdf "yet another file.txt")
Это не работает:
#!/bin/bash find . -name "$1" | ( cat - > /tmp/names file -N --mime-type --files-from /tmp/names ) | ( cat - > /tmp/mimes # files=("$(grep -o '^[^:]*' /tmp/mimes)") #one element array # files=($(grep -o '^[^:]*' /tmp/mimes)) #files with spaces end up split in to several elements # files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\\ /g')) #same but with \ terminated strings files=($(grep -o '^[^:]*' /tmp/mimes | cat <(echo '"') - <(echo '"'))) mimes=($(grep -o '[^:]*$' /tmp/mimes)) total=${#files[*]} for (( i=0; i<=$(( $total -1 )); i++ )) do echo Mime: "${mimes[$i]}" File: "${files[$i]}" done printf "$i\n" )
Изменить: Уточнение
файл / tmp / mimes содержит:
./New Text.txt: text/plain
Если я готовлю его, чтобы получить все до «:»,
grep -o '^[^:]*' /tmp/mimes
он выводит: ./New Text.txt
Я хочу поместить этот вывод в массив, но у него есть пробел, поэтому я избегаю пространства с помощью sed.
files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\\ /g'))
Это не работает. Я получаю файлы [0] = "./New \" и файлы [1] = "Text.txt"
Мой вопрос – почему это не ускользает от космической работы?
Если я сделаю:
files=(./New\ Text.txt)
Он работает, однако, файлы [0] = «./New Text.txt». Почему выполняется экранирование, когда вы делаете это вручную, но когда это результат grep и sed, он не работает. Похоже, поведение создания массива непоследовательно.
- Извлечение почтовых адресов
- 7z не исключает каталоги из файла исключений
- Использование sed в сценарии оболочки с многострочными переменными
- Невозможно конкатенировать пути к файлам, разрешено отклонение
- Выполнить опцию по умолчанию, если в getopts не указаны параметры
- Удалить строки из файла с разделителями табуляции с отсутствующими значениями
- udev power_supply правила не запускают
- pssh (Parallel-ssh), передающий разные параметры для каждого хоста
One Solution collect form web for “Исключение пробелов в сценарии bash не работает”
Если вы хотите разделить имена файлов по символам новой строки, установите IFS в $'\n'
и выключите глобулизацию:
set -f IFS=$'\n' files=($(grep -o '^[^:]*' /tmp/mimes)) set +f
Обратите внимание, что он ломается, если ваши имена файлов содержат символы новой строки (в дополнение к двоеточиям, которые прерываются из-за того, как вы извлекаете имена с помощью grep).