我使用过 printf 但它从文件本身获取变量。我想复制所有代码而不对 new_file 进行任何更改。
printf "${name}_delete()
{
bhyvectl --vm=${name} --destroy
sleep 5
ifconfig ${tap} destroy
sysrc cloned_interfaces-=${tap}
sed -i '' 's/ addm ${tap}//g' /etc/rc.conf
sed -i '' 's/service ${name} start | sleep 5//g' /usr/local/etc/rc.d/bhyve
sed -i '' '/^$/d' /usr/local/etc/rc.d/bhyve
zfs destroy -r zroot/VMs/${name}
rm /usr/local/etc/rc.d/${name}
}\n" >> new_file
答案1
cat
我相信执行此操作的最佳工具是与此处引用的文档一起使用:
cat <<'END_SCRIPT' >>new_file
${name}_delete()
{
bhyvectl --vm=${name} --destroy
sleep 5
ifconfig ${tap} destroy
sysrc cloned_interfaces-=${tap}
sed -i '' 's/ addm ${tap}//g' /etc/rc.conf
sed -i '' 's/service ${name} start | sleep 5//g' /usr/local/etc/rc.d/bhyve
sed -i '' '/^$/d' /usr/local/etc/rc.d/bhyve
zfs destroy -r zroot/VMs/${name}
rm /usr/local/etc/rc.d/${name}
}
END_SCRIPT
这会将此处文档的内容按原样附加到 fie 的末尾,而不用任何变量的值替换或进行任何其他扩展new_file
。
正是对初始分隔符的引用END_SCRIPT
使其成为引这里-文档。该字符串END_SCRIPT
是任意字符串,但选择它是有意义的,这样它就具有一定的描述性(就像您选择描述性变量名称一样)。
请注意,您输出的脚本包含未加引号的变量扩展和其他错误。更正这个:
cat <<'END_SCRIPT' >>new_file
${name}_delete ()
{
bhyvectl --vm="$name" --destroy
sleep 5
ifconfig "$tap" destroy
sysrc cloned_interfaces-="$tap"
sed -i '' "s/ addm $tap//g" /etc/rc.conf
sed -i '' "s/service $name start | sleep 5//g" /usr/local/etc/rc.d/bhyve
sed -i '' '/^$/d' /usr/local/etc/rc.d/bhyve
zfs destroy -r "zroot/VMs/$name"
rm "/usr/local/etc/rc.d/$name"
}
END_SCRIPT
我假设您想要在嵌入脚本运行时的两次调用中扩展变量tap
和。我删除了变量名称周围不必要的大括号,并添加了适当的双引号。name
sed