如何复制脚本中包含变量的特定行而不更改到新文件

如何复制脚本中包含变量的特定行而不更改到新文件

我使用过 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和。我删除了变量名称周围不必要的大括号,并添加了适当的双引号。namesed

相关内容