Как вы можете токенизировать строку bash в массив, если строка содержит символ *? - PullRequest
0 голосов
/ 04 июля 2019

Я давно использовал код, похожий на:

string="abc 123 xyz"
fields=( ${string} )
echo "The 3rd field = ${fields[2]}"

для разбиения строки на поля и ссылки на определенный элемент в строке.

Но сегодня я столкнулся со странным случаем использования, когда исходная строка содержала символ звездочки '*'. то есть:

string="abc * xyz"
fields=( ${string} )
echo "The 3rd field = ${fields[2]}"
declare -p fields

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

Три вопроса:

  1. Что именно * расширяется до?
  2. Можно ли отключить это расширение, чтобы код работал в соответствии с назначением?
  3. Есть ли лучший способ выполнить преобразование строки в массив токенов, которые не страдают от этого побочного эффекта?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Пусть read сделает это; Раскрытие параметров без кавычек зависит как от расширения пути, так и от разбиения слов, поэтому * распространяется на все имена файлов в текущем рабочем каталоге.

read -a fields <<< "$string"

Кроме того, расширение пути также может быть отключено, что позволяет

set -f
fields=( $string )
set +f
0 голосов
/ 04 июля 2019
    • распространяется на все файлы в текущем каталоге, так же, как ls *
  1. Используйте одинарные кавычки. {string = "abc '*' xyz"}
  2. Может быть, но это хороший способ :-)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...