Причина непоследовательного поведения одинарных кавычек при расширении параметра BASH? - PullRequest
0 голосов
/ 14 декабря 2018

При использовании BASH Расширение параметра строка, в которую распространяется переменная, может быть заключена в кавычки / экранироваться, что прекрасно работает, за исключением случаев, когда используются одинарные кавычки и вся переменная экранируется в двойных кавычках:

$ echo "${var:-\\a}"
\a # ok
$ echo "${var:-"\\a"}"
\a # ok
$ echo "${var:-$'\\a'}"
\a # ok
$ echo "${var:-'\a'}"
'\a' # wtf?

Интересно, что цитаты $' ' работают нормально, а ' ' - нет.Одинарные кавычки начинают работать правильно, если сама переменная не заключена в кавычки:

$ echo ${var:-'\a'}
\a

Но это может привести к другим проблемам, если $var сам содержит пробельные символы.

Есть ли веская причиназа это несоответствие?

1 Ответ

0 голосов
/ 14 декабря 2018

Я думаю, что это наиболее релевантная цитата из исходного кода (y.tab.c):

  /* Based on which dolstate is currently in (param, op, or word),
     decide what the op is.  We're really only concerned if it's % or
     #, so we can turn on a flag that says whether or not we should
     treat single quotes as special when inside a double-quoted
     ${...}. This logic must agree with subst.c:extract_dollar_brace_string
     since they share the same defines. */
  /* FLAG POSIX INTERP 221 */

  [...]

  /* The big hammer.  Single quotes aren't special in double quotes.  The
     problem is that Posix used to say the single quotes are semi-special:
     within a double-quoted ${...} construct "an even number of
     unescaped double-quotes or single-quotes, if any, shall occur." */
  /* This was changed in Austin Group Interp 221 */

Мне не совсем понятно почему одинарные кавычки не особенные,но это похоже на сознательный выбор, сделанный после долгих (и мне говорили спорных) дебатов, предшествующих изменению.Но дело в том (если я правильно суммирую это), одиночные кавычки здесь являются просто обычными символами, а не синтаксическими кавычками, и трактуются буквально.

...