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

  • Обмен одной колонки из файла1 с файлами из файла2
  • Редактирование файла конфигурации с помощью сценария bash
  • Проверить, если $ 1 ИЛИ $ 2 равны нулю с "-z" - BASH
  • Создание образа файловой системы ext3 без mkfs.ext3
  • Вставка строки в файл только в том случае, если эта строка еще не является частью файла
  • Передача аргументов с пробелами и кавычками в скрипт (без цитирования всего)
  • Использование ссылки на строковую переменную bash в sed
  • Скрипт для эмуляции Windows + клавиша
  • One Solution collect form web for “Исключение пробелов в сценарии bash не работает”

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

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

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

    Interesting Posts

    Невозможно установить Linux Mint Cinnamon или Ubuntu, в то время как переключаемая графика включена

    Откорректируйте скрипт для получения только определенного выходного отчета rtvscand

    pssh (Parallel-ssh), передающий разные параметры для каждого хоста

    gpg: дешифрование без пароля работает в терминале, но не в msmtp / mutt на основе tmux (невозможно открыть / dev / tty)

    Элементарный звук без звука после обновления alsa

    yum remove не является идемпотентным

    Как просмотреть журналы iptables в systemd

    Первое судо всегда медленно

    Как сделать порт, предназначенный для определенного запланированного процесса?

    Рекомендация для пула накопителей usb

    Захват содержимого экрана для анализа ошибок

    Программа, которая передает STDIN в STDOUT с разделителями цветовых кодов?

    Функционал posix_fadvice / POSIX_FADV_DONTNEED в Linux?

    Почему мой RAID-массив продолжает меняться?

    Не монтировать после перезапуска?

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