Исключение пробелов в сценарии bash не работает

Ничего, что я пробовал, работает. Посмотрите на строки grep для массива в приведенном ниже скрипте. Сбежание, кажется, ничего не делает. Но если я создаю статически назначенный массив, все в порядке.

Такие как:

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, он не работает. Похоже, поведение создания массива непоследовательно.

One Solution collect form web for “Исключение пробелов в сценарии bash не работает”

Если вы хотите разделить имена файлов по символам новой строки, установите IFS в $'\n' и выключите глобулизацию:

 set -f IFS=$'\n' files=($(grep -o '^[^:]*' /tmp/mimes)) set +f 

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

  • Как получить сигнал / сообщение об ошибке в сценарии?
  • Проверьте, есть ли файлы, соответствующие шаблону, чтобы выполнить скрипт
  • Вывод команды Pipe на Yad, а также запись результата в файл журнала
  • Добавлять файл, выводить на экран и перенаправлять из stderr все сразу, без тройника
  • Как я могу захватить stdout / stderr в файле, но все еще вижу его в моей консоли?
  • команда sed - Заменить строку в файле
  • Как сделать необязательные аргументы, которые могут быть именами файлов, содержащими пробелы
  • Изменение шаблонов гвоздики zsh для использования с cp
  • Как вызвать ошибку 77 EBADFD в Linux
  • echo $ 1 = некотируемая разнесенная строка?
  • Команда find и rm не подчиняется исключающему списку
  • Interesting Posts

    curl page source из текстового файла, содержащего URL-адреса

    Не удается подключить CentOS на порту 9200

    Восстановление (еще не созданного) RAID5 с URE (неисправимые ошибки чтения)

    nginx обратный прокси: ошибка хоста не допускается

    Каковы возможные способы, которыми система Debian Linux может записывать данные на жесткий диск и как их избежать?

    Переключение уровня запуска при перемещении / var в другой раздел

    добавить новый объект syslog

    Как найти и переместить текстовую строку внутри файла?

    Ведение `/ etc / hosts` для хостов на DHCP

    Как восстановить зашифрованный жесткий диск LUKS?

    Сервер, запущенный на гостевой Linux VM, не будет принимать подключения с хоста Windows

    dircolors: правила для _ext (а не .ext)

    Создание двоичного файла определенной длины

    Сохранение вывода в файл при запуске терминала xfce4 при использовании переключателя –command

    Как сохранить сеанс регистрации в Arch Linux?

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