Передача переменной в скрипт bash, который использует «EOF» и считает переменную литералом

Передача переменной в скрипт bash, который использует «EOF» и считает переменную литералом

в этом скрипте я в итоге сохраняю «$1» в файле /test.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

правда в том, что мне нужно сохранить

'EOF'

как «EOF», потому что мой аргумент ($1) содержит знаки доллара.

но мне нужен этот аргумент, чтобы сэкономить, а не 1 доллар

решение1

Продолжаем следить за вашимипредыдущий вопрос, похоже, вы хотитеобанекоторый неинтерпретируемый текст и некоторый интерпретируемый текст, идущий в файл. В этом случае используйте два разных cats (или echos):

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

Здесь происходит несколько вещей: во-первых,хередоксинтаксис с <<. Если вы включите кавычки в эту строку-терминатор, как в первой строке выше, весь heredoc не будет интерпретирован — без параметров и без подстановок. Если вынеиспользуйте любые кавычки, как ввторой catвыше, переменные, как $1будут заменены их значениями, и подстановки команд будут включены в текст. Вы выбираете, заключать ли строку "EOF" в кавычки или нет, в зависимости от того, нужны ли вам подстановки или нет.

Чтобы поместить оба cats в один файл, мы используем>> перенаправлениедля второго (и последующих) перенаправлений: это означает добавление к файлу. Для первого мы используем сингл, >чтобы очистить файл и начать заново.

Обратите внимание, что даже когдапеременные заменяются, любые дополнительные знаки доллара в значении этой переменнойне являютсяпереподставили себя:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

выведет:

$bar

без подстановки $barзначения.

Однако, если вы указываете "$" в аргументе всего этого скрипта, вам нужно экранировать его в командной строке или заключить все в одинарные кавычки. В качестве альтернативы,замена командыкак вВаш другой вопроспозволяет вам напрямую вставить содержимое целого файла, включая любые знаки доллара в содержимом файла. Убедитесь, что вы заключили в кавычки строку подстановки:

oo.sh "$(cat myfile)"

получит тело myfileкак $1и может затем catили echoего как требуется. Те же ограничения, что и вмой ответ тамapply: есть ограничение на длину аргументов командной строки, и если ваш файл может оказаться длиннее, вам следует найти другой подход. Вы можете узнать, каков предел в вашей системе, с помощьюgetconf ARG_MAX

решение2

Похоже, вы просто хотите вывести одну переменную в файл. В таком случае это сработает:

echo $1 >/test

Обратите внимание, что он /testнаходится в корневом каталоге, в который обычные пользователи обычно не имеют прав на запись.

EDIT: Имейте в виду, что вам нужно заключить в кавычки строку, содержащую знак доллара.в командной строке. Именно здесь происходит подмена, и сценарий ничего не может с этим поделать постфактум.

Связанный контент