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

  • Загрузка нескольких похожих URL-адресов с использованием скобок
  • Как использовать специальную переменную оболочки в операторах If then
  • Как предотвратить перемещение символов в переменной среды?
  • Отправка команды на экран и syslog
  • разделить линию на основе пробела и удалить вторую часть
  • Есть ли опция / команда для дифференциации файлов на основе состояния копии файла в каталоге?
  • Запуск исполняемого файла с помощью скрипта оболочки
  • Как я могу заставить переменные среды «экспортироваться» в скрипт оболочки?
  • One Solution collect form web for “Исключение пробелов в сценарии bash не работает”

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

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

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

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