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 .

  • Скрипт командной строки с использованием строки
  • Объединение команд строк и grep: как ограничить результаты строками с нулевым завершением
  • Как извлечь дату и рассчитать, находится ли она в течение «х» дней с сегодняшнего дня?
  • Печать диапазонов вывода с эхом
  • Разбор JSON на оболочке
  • Bash: как получить значение из массива для создания команды из него
  • ls для строки cut -f не работает
  • Изменить регистр n-й буквы в строке
  • Список всех обычных файлов, содержащих (в их имени, каталоге или их содержимом) определенную (под) строку
  • Bash - ожидаемое целочисленное выражение
  • Проверьте, имеет ли переменная оболочки более одной строки с использованием встроенных модулей?
  • Interesting Posts

    lpr игнорирует параметры, заданные -o

    Есть ли видеопроигрыватель для Linux, который имеет предварительный просмотр миниатюр?

    Как проверить, какие «нормальные» пользователи существуют в системе?

    Сделайте несколько изменений с помощью одного вызова sed

    Проблема с yum – ошибка при импорте одного из модулей python

    Что лучше для веб-сервера уровня продукта: RHEL / Ubuntu Server / Debian / CentOS

    Как отключить историю командной строки сеанса оболочки в AIX 5-6?

    Будет ли apt-get dist-upgrade -y подтверждать обновления с вопросами проверки?

    Менеджер паролей командной строки, который использует SSH-ключ для аутентификации

    Поиск RPM для установки

    Как искать между 2-м и 3-м разделителями

    Загрузка с использованием initramfs вместо uramdisk

    Тест производительности MPlayer – счетчик FPS в реальном времени

    Была ли заменена ntpd OpenBSD на другие BSD? Или Linux?

    Как разрешить, когда IP-адрес сервера NFS изменяется

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