Во-первых, обратите внимание, что
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', когда никакие позиционные параметры не предоставлены.Код должен быть изменен, если это не то, что требуется.