В обоих питона и Node.js, есть разница между тем, как print
работает со скалярными строками и, как она работает с коллекциями.
Строки печатаются просто как последовательность символов. Получаемый результат обычно является тем, что ожидает пользователь, но он не может использоваться как представление строки на языке. Но когда распечатывается список/массив, то, что вы получаете, является допустимым литералом list/array, который может использоваться в программе.
Например, в Python:
>>> print("x")
x
>>> print(["x"])
['x']
При печати строки, вы видите только символы. Но при печати списка, содержащего строку, python добавляет символы кавычек, так что вывод является допустимым литералом списка. Кроме того, было бы добавить обратную косую черту, если это необходимо:
>>> print("\\")
\
>>> print(["\\"])
['\\']
Node.js работает точно таким же образом:
$ node -p '"\\"'
\
$ node -p '["\\"]'
[ '\\' ]
При печати строку, содержащую один символ обратной косой черты, вы просто получите один обратный слэш , Но когда вы печатаете список/массив, содержащий строку, состоящую из одной обратной косой черты, вы получаете строку с кавычками, в которой обратная косая черта сбрасывается с помощью обратного слэша, что позволяет использовать ее как литерал в программе.
Как и при печати строк в узле и python, стандартная утилита оболочки echo
просто печатает фактические символы в строке. В стандартной оболочке нет механизма, сходного с печатанием массивов на узлах и питонах.Bash, однако, обеспечивает механизм для распечатки значения переменного в формате, который может быть использован в качестве части программы Баша:
$ quote=\"
# $quote is a single character:
$ echo "${#quote}"
1
# $quote prints out as a single quote, as you would expect
$ echo "$quote"
"
# If you needed a representation, use the 'declare' builtin:
$ declare -p quote
declare -- quote="\""
# You can also use the "%q" printf format (a bash extension)
$ printf "%q\n" "$quote"
\"
(Список литературы:. Баш руководства по declare
и printf
Или типу help declare
и help printf
в Баш сессии.)
Это не полная история, хотя. Также важно понять, как оболочка интерпретирует то, что вы набираете. Другими словами, когда вы пишете
some_utility \" "\"" '\"'
Что some_utility
фактически видеть в массиве ARGV?
В большинстве контекстов стандартной оболочки (включая bash) последовательности escape-последовательностей C-типа, такие как \t
, не интерпретируются как таковые. (Стандартная утилита оболочки printf
интерпретирует эти последовательности, когда они появляются в строке формата, а некоторые другие стандартные утилиты также интерпретируют последовательности, но сама оболочка не делает этого.) Обработка обратной косой черты стандартной оболочкой зависит от контекста:
Некотируемые строки: обратный слеш цитирует следующий символ, то, что это (если он не является новой строки, в этом случае как обратная косая черта и символ новой строки удаляются от входа).
строк в двойных кавычках: обратный слэш может быть использован, чтобы избежать символов $, \, ", `, также обратный слэш с последующим переводом строки удаляется из входа, как и в некорректная строка. В bash, если расширение истории включено (по умолчанию оно находится в интерактивных оболочках), обратная косая черта также может использоваться для предотвращения расширения истории !, но обратная косая черта сохраняется в последней строке.
Строки с одним кавычком: обратная косая черта рассматривается как нормальный символ. (В результате, нет никакого способа, чтобы включить одинарные кавычки в одинарных кавычках.)
Bash добавляет еще два цитирования механизма:
C-стиль квотирования, $'...'
. Если одноколейной строке предшествует знак доллара, то escape-последовательности C-стиля внутри строки равны, которые интерпретируются примерно так же, как компилятор C. Это включает в себя стандартные пробельные символы, такие как символ новой строка (\n
), восьмеричные, шестнадцатеричные и Юникод побеги (\010
, \x0a
, \u000A
, \U0000000A
), плюс несколько последовательностей не-C, включая «контрольный» символы (\cJ
) и символ ESC \e
или \E
(то же, что и \x1b
). Обратные слэши также могут использоваться для выхода \, ' и ".(Обратите внимание, что это другой список из списка сглаживаемых символов в строках с двойными кавычками, здесь обратная косая черта перед знаком доллара или обратной сеткой равна , а не, тогда как обратная косая черта перед отдельной цитатой является специальной, более того, обратная косая черта-последовательность строк не интерпретируется.)
Местный-специфический перевод: $"..."
. Если для строки с двойными кавычками предшествует знак доллара, обратные слэши (и переменные расширения и подстановки команд) интерпретируются как нормальные строки с двойными кавычками, а затем строка просматривается в каталоге сообщений, определяемом текущей локалью.
(Литература. Posix standard, Bash manual)
Я предполагаю, что вы пропустили это разница между тем, что содержит строку, и как строка вводится в программу. Например, что вы ожидаете от значений python-выражений 'len (" \ n ")' и 'len (" \\ n ")'? А что такое python/node.js, показывающий вам, когда вы печатаете список/массив? Я добавил гораздо более длинный ответ. – rici