Поведение расширения переменной Bash при использовании одиночных пробелов или двойных интервалов

У меня была проблема в резервном сценарии удара, вызванном следующим поведением, которое я не понимаю.

Во-первых, мы создаем параметр, содержащий строку с 2 последовательными пробелами (прямо прежде' <'):

me@mysystem:~$ TEST="a string with 2 spaces right  <--HERE!"
me@mysystem:~$ echo $TEST
a string with 2 spaces right <--HERE!

Я могу grep пространство:

me@mysystem:~$ echo ${TEST} | grep " "
a string with 2 spaces right <--HERE!

Я могу grep пространство, сопровождаемое другой буквой:

me@mysystem:~$ echo ${TEST} | grep " s"
a string with 2 spaces right <--HERE!

Я могу grep часть после 2 пробелов:

me@mysystem:~$ echo ${TEST} | grep "HERE"
a string with 2 spaces right <--HERE!

Я могу сделать переменное расширение, заменяющее оба пробелов подчеркиванием:

me@mysystem:~$ echo ${TEST// /_}
a_string_with_2_spaces_right__<--HERE!

Но захват двойного интервала требует заключения в кавычки переменной:

me@mysystem:~$ echo $TEST   | grep "  "; echo "Done."
Done.
me@mysystem:~$ echo ${TEST} | grep "  "; echo "Done."
Done.
me@mysystem:~$ echo "$TEST" | grep "  "; echo "Done."
a string with 2 spaces right  <--HERE!
Done.
me@mysystem:~$ echo "${TEST}" | grep "  "; echo "Done."
a string with 2 spaces right  <--HERE!
Done.

Я не понимаю почему дело обстоит так.

Длинная короткая история: Я имел, если оператор в сценарии, проверяющем, представляет ли $ {ФАЙЛ} существующий файл и это, по-видимому, также, прекращает интерпретировать переменную при обнаружении с пространством, если не заключено в кавычки. Таким образом, я больше не уверен, что $ {} делает или на самом деле не заботится прочь.

Лучше всегда заключать в кавычки переменную, которую я предполагаю?

4
задан 18 November 2016 в 23:00

1 ответ

Это - классический случай разделения слова, сделанного оболочкой, на неупомянутом переменном расширении.

В основном, когда Вы делаете, $TEST (без кавычек ("$TEST")), оболочка:

  • Выполняет разделение слова, на основе значения IFS переменная среды (значение по умолчанию: пространство, вкладка, новая строка), и разделения, целое расширение в отдельные слова

  • поэтому, поскольку у Вас есть два последовательных пробелов, разделение слова (и также путь (шарик) расширение, если какой-либо из *, ?, [] присутствует) сделано, и когда выходная строка восстановлена слова, присоединены пространством, в результате у Вас есть только одно пространство между right и <--HERE!. Это было бы верно для любой комбинации IFS символы.

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

"${variable}"
5
ответ дан 1 December 2019 в 09:32

Другие вопросы по тегам:

Похожие вопросы: