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

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

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

cat <<EOF >  file.sh
$EXPAND
$PRINTLITERALLY
EOF

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

-bash: urlencode: command not found

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

答案1

EXPAND=value
cat <<EOF >  file.sh
$EXPAND
\$PRINTLITERALLY
EOF

将创建file.sh

value
$PRINTLITERALLY

作为内容。

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

另一种方法:

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

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

有了上面的内容,你会得到:

value
test
...
$PRINTLITERALLY
`echo test`
...
value
...

如果您只想扩展一组特定的变量,无论它们出现在何处,而保留所有其他参数扩展、命令替换、算术扩展未扩展,您可以使用envsubstGNU 附带的实用程序gettext

但请注意,它仅扩展$var${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__

给出:

value value ${EXPAND#?} ${EXPAND[0]} value[0] valueÉ \value
$PRINTLITERALLY othervalue
`echo test`

请参阅info gettext envsubst了解更多详情。

相关内容