Intereting Posts
Порт открыт высоко в течение нескольких минут чаще Что еще нужно для использования clang, кроме «apt-get install clang; clang hw.cpp "? сменяет разрешение на изменение каталога Правила udev не задают правильную группу и разрешения Как узнать, какой WINEPREFIX используется / bin / sh – echo >> не работает как ожидалось Почему я проигрываю аудио на VLC при воспроизведении видео HQ? Как сбить имя файла с помощью SED Как добавить гостевую виртуальную машину KVM в virsh Mutt не хранит сообщения в Отправленных (запись) в неинтерактивном режиме. Прокси-сервер на FreeBSD отклоняет соединения Как загрузить видео из протокола rtmp из-за прокси-сервера, используя rtmpdump Установка альтернативных устройств (с различными вариантами крепления) в одной точке подключения Как перенести аргументы командной строки с помощью emacs keybindings? Как получить подробный графический интерфейс Kubuntu для изменения региональных / локальных настроек без установки всего KDE?

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

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

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

правда … мне нужно держать

 'EOF' 

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

но мне нужен этот аргумент для сохранения, а не $ 1

Следуя вашему предыдущему вопросу , звучит так, будто вы хотите, чтобы и какой-то неинтерпретированный текст, и какой-то интерпретированный текст попадал в файл. В этом случае используйте два разных cat s (или echo s):

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

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

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

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

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

выведет:

 $bar 

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

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

 oo.sh "$(cat myfile)" 

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

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

 echo $1 >/test 

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

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