我想从 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
...
如果您只想扩展一组特定的变量,无论它们出现在何处,而保留所有其他参数扩展、命令替换、算术扩展未扩展,您可以使用envsubst
GNU 附带的实用程序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
了解更多详情。