2015-10-07 3 views
3

Должен ли я приводить переменные при выполнении расширения параметра Bash?Цитаты в расширении переменной замещения шаблона Bash

Например, в случае, если "${E}" быть в кавычках?

(
E="-END" 

X=(ABC 123 "ABC 123") 
X=("${X[@]/%/"${E}"}") 

IFS=$'\n' 
echo "${X[*]}" 
) 

Я заметил на 4.2 версии Баша это приведет к следующему выходу

ABC"-END" 
123"-END" 
ABC 123"-END" 

Но на 4.3 версии Баша это приведет к следующему выходу

ABC-END 
123-END 
ABC 123-END 

Это ошибка, которая была исправлена?

Редактировать. Изменено "$E" к "${E}"

ответ

2

Это не ошибка, но документирован в official change log: подробности

Этого документа изменения между этой версией, Баш-4,3-альфа, и предыдущей версией, bash- 4,2-релиз.

...

zz. При использовании расширения слова для замены шаблонов bash теперь запускает строку замены путем удаления цитаты, поскольку она позволяет котировкам в этой строке действовать как escape-символы. Это не обратно совместимо, поэтому можно отключить, установив режим совместимости bash в 4.2.

Для переключения режима совместимости (если вы хотите поэкспериментировать):

shopt -s compat42 

, и вы увидите, что 4.3 ведет себя как 4.2 и дезактивировать его:

shopt -u compat42 
+0

удивительным. что бы вы сделали? использовать цитаты? – Jon

+0

@JamesAndrews Если вам не нужны кавычки в выводе, то не указывайте '$ E', а если вы хотите кавычки, то избежите цитат' \ '$ E \ "'. Это должно быть довольно переносимым в разных версиях. Другая возможность - использовать опцию оболочки 'compat42', чтобы гарантировать одинаковое поведение в разных версиях (но тогда вам нужно будет проверить, что ваша версия Bash ≥4.2). –