创建扩展一个变量但不扩展另一个变量的文件

Fre*_*edo 0 shell-script cat

我想从 bash 脚本创建一个文件。但是我需要扩展一些变量并从字面上打印其他变量这可能吗?

cat <<EOF >  file.sh
$EXPAND
$PRINTLITERALLY
EOF
Run Code Online (Sandbox Code Playgroud)

此外,我正在尝试创建一个非常大的文件,当我尝试将其粘贴到终端中进行测试时,出现如下错误:

-bash: urlencode: command not found
Run Code Online (Sandbox Code Playgroud)

所以看起来我可能有 bash 正在解释的东西,在运行它时会影响我的 bash 脚本吗?我觉得必须有更好的方法来从我的 bash 脚本创建文件

Sté*_*las 5

EXPAND=value
cat <<EOF >  file.sh
$EXPAND
\$PRINTLITERALLY
EOF
Run Code Online (Sandbox Code Playgroud)

file.sh

value
$PRINTLITERALLY
Run Code Online (Sandbox Code Playgroud)

作为内容。

(您需要在每次出现$`不希望扩展相应参数扩展、算术扩展或命令替换的位置之前添加反斜杠。并且您还需要转义一些反斜杠字符)。

另一种方法:

cat - << EXPANDED /dev/fd/3 3<< 'NOT-EXPANDED' /dev/fd/4 4<< EXPANDED-AGAIN > file.sh
$EXPAND
`echo test`
...
EXPANDED
$PRINTLITERALLY
`echo test`
...
NOT-EXPANDED
$EXPAND
...
EXPANDED-AGAIN
Run Code Online (Sandbox Code Playgroud)

引用分隔符的 here 文档(如上3<< 'NOT-EXPANDED'所示)不进行 shell 扩展,因此您可以决定执行扩展的部分和不执行扩展的部分。

有了上面的,你会得到:

value
test
...
$PRINTLITERALLY
`echo test`
...
value
...
Run Code Online (Sandbox Code Playgroud)

如果您只想扩展一组特定的变量,而不扩展所有其他参数扩展、命令替换、算术扩展,您可以使用envsubstGNU 附带的实用程序gettext

但是请注意,它只扩展$varand ${var},而不是涉及$var变量的任何其他形式的参数扩展(如${var#?}, ${var[x]}...)

EXPAND=value EXPAND_AS_WELL=othervalue
export EXPAND EXPAND_AS_WELL
envsubst '$EXPAND$EXPAND_AS_WELL' << '__end_of_envsubst__' > file.sh
$EXPAND ${EXPAND} ${EXPAND#?} ${EXPAND[0]} $EXPAND[0] $EXPANDÉ \$EXPAND
$PRINTLITERALLY $EXPAND_AS_WELL
`echo test`
__end_of_envsubst__
Run Code Online (Sandbox Code Playgroud)

给出:

value value ${EXPAND#?} ${EXPAND[0]} value[0] valueÉ \value
$PRINTLITERALLY othervalue
`echo test`
Run Code Online (Sandbox Code Playgroud)

有关info gettext envsubst更多详细信息,请参阅。