У меня была проблема в резервном сценарии удара, вызванном следующим поведением, которое я не понимаю.
Во-первых, мы создаем параметр, содержащий строку с 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.
Я не понимаю почему дело обстоит так.
Длинная короткая история: Я имел, если оператор в сценарии, проверяющем, представляет ли $ {ФАЙЛ} существующий файл и это, по-видимому, также, прекращает интерпретировать переменную при обнаружении с пространством, если не заключено в кавычки. Таким образом, я больше не уверен, что $ {} делает или на самом деле не заботится прочь.
Лучше всегда заключать в кавычки переменную, которую я предполагаю?
Это - классический случай разделения слова, сделанного оболочкой, на неупомянутом переменном расширении.
В основном, когда Вы делаете, $TEST
(без кавычек ("$TEST"
)), оболочка:
Выполняет разделение слова, на основе значения IFS
переменная среды (значение по умолчанию: пространство, вкладка, новая строка), и разделения, целое расширение в отдельные слова
поэтому, поскольку у Вас есть два последовательных пробелов, разделение слова (и также путь (шарик) расширение, если какой-либо из *
, ?
, []
присутствует) сделано, и когда выходная строка восстановлена слова, присоединены пространством, в результате у Вас есть только одно пространство между right
и <--HERE!
. Это было бы верно для любой комбинации IFS
символы.
, Короче говоря заключите свои переменные расширения в кавычки:
"${variable}"