Bash: Родной способ избавиться от цитаты вокруг каждого элемента массива

Я прочитал массив из другого сценария. Этот массив должен помещать " " вокруг» всех членов массива, поскольку некоторые члены пустые.

 in_file=./data vector=($(./readdata.sh 0 $in_file)) for index in ${!vector[@]} do echo ${vector[index]} done 

Проблема в том, что у меня есть цитаты вокруг каждой выходной строки, и я хочу избавиться от них.

 "red" "blue" "green" "" "white" "black" 

должен измениться на:

 red blue green white black 

Я ищу метод, который не использует awk , tr , sed или любой другой путь на основе конвейера. Я просто хочу решить с использованием родных способов, таких как использование скобок, разных пунктуаций, ….

4 Solutions collect form web for “Bash: Родной способ избавиться от цитаты вокруг каждого элемента массива”

Это может сработать:

 in_file=./data vector=($(./readdata.sh 0 $in_file)) for index in ${!vector[@]} do echo ${vector[index]//\"/} done 

Ссылка: http://www.tldp.org/LDP/abs/html/refcards.html#AEN22828

Поскольку вы предпочитаете один лайнер,

 vector=("${vector[@]//\"/}") 

Помните, что текстовые подстановки могут работать для массива в целом.

Вы сделаете вашу программу более простой и надежной, если readdata.sh создает данные с разделителями строк без дополнительных кавычек.

В вашей текущей программе вывод readdata.sh разбивается на пробелы (так, например, "ab" приводит к двум элементам массива "a и b" ), и каждое результирующее слово интерпретируется как шаблон подстановки (например, "a * b" приводит к "a , затем именам файлов в текущем каталоге и, наконец, b" ). См. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? Больше подробностей.

Bash предоставляет очень простой способ чтения данных с разделителями mapfile встроенный mapfile . Поскольку bash выполняет правую часть конвейера в подоболочке, вы не можете просто написать ./readdata.sh 0 "$in_file" | mapfile -t vector ./readdata.sh 0 "$in_file" | mapfile -t vector , вы должны использовать переменную в командном блоке, или вы можете использовать замену процесса:

 in_file=./data mapfile -t vector < <(./readdata.sh 0 "$in_file") for index in "${!vector[@]}" do echo "$index: ${vector[index]}" done 

Если вы не используете индексы, то только элементы, более простой способ итерации по массиву

 for element in "${vector[@]}" do echo "$element" done 

Если вы хотите избежать «взломанного» решения поиска и замены, использование eval похоже, выполняет эту работу:

 vector=( $(eval echo ${vector[@]}) ) 

Это заставляет оболочку интерпретировать их как приведенные аргументы для echo , что устраняет кавычки. Конечно, линия выше, поскольку она имеет все еще проблемы с пробелом, но ключевым моментом здесь является идея использования eval .

  • awk расширенное сопоставление шаблонов (сопоставление шаблонов внедрения в действиях для уже сопоставленных строк)
  • Как выполнить grep -v -e 'expr1' и grep -e 'expr2' в одной команде?
  • извлекать часть текста из всех совпадающих строк
  • заменяя многострочную строку другой многострочной строкой, используя sed
  • Сценарий оболочки для назначения значений из таблицы поиска слишком медленный
  • Удалить последний символ из строки, захваченной с помощью awk
  • Строки соответствия, начинающиеся с одного шаблона в двух текстовых файлах
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • Выполнение нескольких команд sed в одних и тех же файлах одновременно
  • Вывод строк поиска с использованием grep в UNIX
  • Заменить всю строку в файле из командной строки
  • Interesting Posts

    некоторые выражения POSIX Bracket Expressions не работают

    Как увидеть результат, созданный make install в freebsd

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

    Разница между очками и tty

    Как проверить несколько условий в выражении IF

    REGEX и GREP – строка поиска, включая необязательные и статические слова

    Как настроить HAproxy для перенаправления нескольких доменов

    Как заблокировать все порты, кроме некоторых?

    Как открыть оболочку UNIX?

    Блочный порт на boot2docker vm на виртуальной машине

    Использование wget, как загрузить в определенное место, без создания папок и всегда перезаписывать исходные файлы

    Как настроить функцию масштабирования xrandr для переключения на следующее или предыдущее разрешение в предопределенном списке?

    Экран Letterbox / Crop 16: 9 при отображении в 4: 3?

    какой язык программирования требуется для разработки ОС Linux?

    LUKS с аутентификацией USB-ключа, насколько это безопасно?

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