Попробуйте:
eval "content=\$(cat << @@@EOF@@@
$(cat file)
@@@EOF@@@
)"
Это расширит подстановки параметров, арифметики и команд, а \
используется для экранирования (из $
, `
и только самого )и продолжения строки -. Например,на вход типа:
* foo
\/-!~
FOO=${FOOBAR} $((1+1)) $(uname)
\${FOOBAR}\\foo\
bar
Это дает что-то вроде:
* foo
\/-!~
FOO=content-of-$FOOBAR 2 Linux
${FOOBAR}\foobar
Должно быть очевидно, что это уязвимость внедрения команд, если содержимое файла не находится под вашим полным контролем.
Этот ответ основан на принятом ответе наhttps://stackoverflow.com/questions/10683349/forcing-bash-to-expand-variables-in-a-string-loaded-from-a-file
и адаптирован из него.#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"
content="$(envsubst < "$file")"
echo "$content"
В отличие от eval
, envsubst
заменяет только переменные, нет риска выполнения других программ посредством подстановки команд или чего-то подобного. Это очень простой инструмент для создания шаблонов для оболочки.
envsubst
является частью утилиты интернационализации GNU gettext (в Debian, она находится в пакете gettext-base
).
Обратите внимание, что envsubst
(, являясь внешней командой, а не оболочкой, созданной -в ), может видеть только те переменные, которые были экспортированы (, но см. стандартную allexport
опцию sh
, чтобы сделать оболочку экспортировать впоследствии определенные переменные в среду ).