새 파일로 변경하지 않고 스크립트의 변수가 포함된 특정 줄을 복사하는 방법

새 파일로 변경하지 않고 스크립트의 변수가 포함된 특정 줄을 복사하는 방법

나는 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

이는 변수나 다른 확장의 값을 바꾸지 않고 문서의 내용을 있는 그대로 파일의 끝에 추가합니다 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

관련 정보