в этом сценарии я получаю «$ 1», сохраняемый в файл / test.
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
правда в том .. мне нужно сохранить
'EOF'
как 'EOF', потому что мой аргумент ($ 1) содержит знаки доллара.
но мне нужно сохранить этот аргумент, а не 1 доллар
bash
shell-script
cat
here-document
user72685
источник
источник
$1
) содержит знаки доллара.' Нет, если это относится к первому параметру командной строки. Замена была выполнена до того, как ваш скрипт был выполнен. Вы должны избежать этого в командной строке.cat
и сохраняйте знаки доллара», но «я хочу изменить параметр,httpd.conf
чтобы изменить <некоторые настройки> в <этот способ>».Ответы:
Вслед за ваш предыдущий вопрос , это звучит , как вы хотите , и некоторые неосмысленный текст и некоторые интерпретировать текст происходят в файл. В этом случае используйте два разных
cat
s (илиecho
s):Здесь происходит пара вещей: во-первых, синтаксис heredoc с
<<
. Если вы включите кавычки в эту строку терминатора, как в первом примере выше, весь heredoc не интерпретируется - без параметров и без подстановок. Если вы не используете кавычки, как во второмcat
выше, переменные наподобие$1
будут заменены их значениями, а подстановки команд будут включены в текст. Вы выбираете, заключить в кавычки строку «EOF» или нет, основываясь на том, хотите ли вы замены или нет.Чтобы поместить оба
cat
файла в один и тот же файл, мы используем>>
перенаправление для второго (и любого более позднего) перенаправления: это означает добавление в файл. Для первого мы используем один,>
чтобы очистить файл и начать все заново.Обратите внимание, что даже при замене переменных любые дополнительные знаки доллара в значении этой переменной сами по себе не заменяются:
будет выводить:
без подстановки в
$bar
значение.Однако, если вы указываете «$» в качестве аргумента для всего этого сценария, вам нужно экранировать его в командной строке или заключить все это в одинарные кавычки. В качестве альтернативы, подстановка команд, как и в вашем другом вопросе, позволяет вам поместить содержимое всего файла напрямую, включая любые знаки доллара в содержимом файла. Убедитесь, что вы указали там строку подстановки:
получит тело
myfile
как$1
и может тогдаcat
илиecho
это как требуется. Здесь применимы те же ограничения, что и в моем ответе : есть ограничение на длину аргументов командной строки, и если ваш файл может стать длиннее, вы должны найти другой подход. Вы можете узнать, какой лимит в вашей системе сgetconf ARG_MAX
источник
Похоже, вы просто хотите вывести одну переменную в файл. В этом случае это будет работать:
Обратите внимание, что он
/test
находится в корневом каталоге, для которого обычные пользователи обычно не имеют разрешения на запись.РЕДАКТИРОВАТЬ: Имейте в виду, что вам нужно заключить в кавычки строку, содержащую знак доллара, в командной строке . Вот где происходит подмена, и сценарий ничего не может с этим поделать.
источник