в этом скрипте я в итоге сохраняю «$1» в файле /test.
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
правда в том, что мне нужно сохранить
'EOF'
как «EOF», потому что мой аргумент ($1) содержит знаки доллара.
но мне нужен этот аргумент, чтобы сэкономить, а не 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 не будет интерпретирован — без параметров и без подстановок. Если вынеиспользуйте любые кавычки, как ввторой cat
выше, переменные, как $1
будут заменены их значениями, и подстановки команд будут включены в текст. Вы выбираете, заключать ли строку "EOF" в кавычки или нет, в зависимости от того, нужны ли вам подстановки или нет.
Чтобы поместить оба cat
s в один файл, мы используем>>
перенаправлениедля второго (и последующих) перенаправлений: это означает добавление к файлу. Для первого мы используем сингл, >
чтобы очистить файл и начать заново.
Обратите внимание, что даже когдапеременные заменяются, любые дополнительные знаки доллара в значении этой переменнойне являютсяпереподставили себя:
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: Имейте в виду, что вам нужно заключить в кавычки строку, содержащую знак доллара.в командной строке. Именно здесь происходит подмена, и сценарий ничего не может с этим поделать постфактум.