Переменная окружения bash echo, содержащая экранированные символы - PullRequest
0 голосов
/ 19 октября 2018

У меня есть скрипт, который выводит введенный ввод в файл следующим образом:

echo $@ > file.txt

Когда я передаю жало типа "\"", я хочу, чтобы оно точно печатало "\"" в файл, однако он печатает ".Мой вопрос заключается в том, как я могу напечатать все символы переменной, содержащей строку, без учета экранирования?

Когда я использую echo в bash, как echo "\"", он печатает только ", тогда как когда я использую echo '"\""', он печатаетэто правильно.Я подумал, может быть, это было бы решением использовать одинарные кавычки вокруг переменной, однако я не могу получить значение переменной внутри одинарных кавычек.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Во-первых, обратите внимание, что

echo $@ > file.txt

может дать сбой несколькими способами. Shellcheck указывает на одну проблему (пропущенные кавычки на $@).См. Принятый и превосходный ответ на вопрос Почему printf лучше, чем echo? для других.

Во-вторых, как уже отмечали другие, для Bash-программы нет практического способа узнатькак именно параметры были указаны в командной строке.Например, для всех этих вызовов

prog \"
prog "\""
prog '"'

код в prog будет видеть значение $1, которое состоит из одного символа двойной кавычки.Любые символы кавычек, которые используются в вызове prog, удаляются с помощью удаления цитаты части расширений оболочки , выполняемой родительским процессом оболочки.

Обычноэто не имеет значения.Если переменные или параметры содержат значения, которые должны быть заключены в кавычки при вводе в виде литералов (например, "\""), их можно безопасно использовать, включая передачу их в качестве параметров другим программам, путем цитирования использования переменной или параметра (например, "$1"), "$@", "$x").

Существует проблема с переменными или параметрами, которые требуют ввода в кавычки при буквальном вводе, если вам нужно записать их так, чтобы их можно было повторно использовать в качестве входных данных оболочки (например,используя eval или source / .).Bash поддерживает спецификацию формата %q для встроенного printf, чтобы справиться с этой ситуацией.Непонятно, что пытается сделать OP, но одно из возможных решений этого вопроса:

if (( $# > 0 )) ; then
    printf -v quoted_params '%q ' "$@"  # Add all parameters to 'quoted_params'
    printf '%s\n' "${quoted_params% }"  # Remove trailing space when printing
fi >file.txt

Это создает пустой файл 'file.txt', когда никакие позиционные параметры не предоставлены.Код должен быть изменен, если это не то, что требуется.

0 голосов
/ 19 октября 2018

Если вы запускаете echo \", функция обратной косой черты в bash - экранировать символ после него.Это фактически позволяет вам использовать двойные кавычки в качестве аргумента.Вы не можете использовать обратную косую черту самостоятельно;если вы хотите иметь обратную косую черту в качестве аргумента, вам нужно использовать другую косую черту, чтобы избежать этого: echo \\

Теперь, если вы хотите создать строку, где эти символы не экранированы, используйте одинарные кавычки: echo '\'

См. Для лучшего объяснения этого поста: Разница между одинарные и двойные кавычки в Bash

...