Вслед за ваш предыдущий вопрос , это звучит , как вы хотите , и некоторые неосмысленный текст и некоторые интерпретировать текст происходят в файл. В этом случае используйте два разных 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
файла в один и тот же файл, мы используем >>
перенаправление для второго (и любого более позднего) перенаправления: это означает добавление в файл. Для первого мы используем один, >
чтобы очистить файл и начать все заново.
Обратите внимание, что даже при замене переменных любые дополнительные знаки доллара в значении этой переменной сами по себе не заменяются:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
будет выводить:
$bar
без подстановки в $bar
значение.
Однако, если вы указываете «$» в качестве аргумента для всего этого сценария, вам нужно экранировать его в командной строке или заключить все это в одинарные кавычки. В качестве альтернативы, подстановка команд, как и в вашем другом вопросе, позволяет вам поместить содержимое всего файла напрямую, включая любые знаки доллара в содержимом файла. Убедитесь, что вы указали там строку подстановки:
oo.sh "$(cat myfile)"
получит тело myfile
как $1
и может тогда cat
или echo
это как требуется. Здесь применимы те же ограничения, что и в моем ответе : есть ограничение на длину аргументов командной строки, и если ваш файл может стать длиннее, вы должны найти другой подход. Вы можете узнать, какой лимит в вашей системе сgetconf ARG_MAX
$1
) содержит знаки доллара.' Нет, если это относится к первому параметру командной строки. Замена была выполнена до того, как ваш скрипт был выполнен. Вы должны избежать этого в командной строке.