Я давно использовал код, похожий на:
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
В этом случае '*' не отображается в массив буквально, скорее он расширяется до списка переменных среды, и массив заканчивается гораздо большим списком или значениями, которые не представляют оригинал строка.
Три вопроса:
- Что именно * расширяется до?
- Можно ли отключить это расширение, чтобы код работал в соответствии с назначением?
- Есть ли лучший способ выполнить преобразование строки в массив токенов, которые не страдают от этого побочного эффекта?