쉘 스크립트에서 중첩된 heredocs를 작동시키는 방법은 무엇입니까? EOF를 인식하지 못하는 것 같습니다.
#!/bin/bash
test(){
cat > /users/shared/test.sh << EOF
#!/bin/bash
check_VPN_status(){
# Returns vpn_status as connected // disconnected
anyconnect_status=$(/opt/cisco/anyconnect/bin/vpn status | grep 'Connected')
globalprotect_status=$(ifconfig | grep -c flags=8050)
if [[ ! -z $anyconnect_status \
|| $globalprotect_status == 0 && -d /Applications/GlobalProtect.app ]]; then
vpn_status=connected
else
vpn_status=disconnected
fi
}
create_pf_conf(){
# Set the network interface to be used
if="en0"
# Set ports to be allowed
allowed_ports="{22}"
cat > "$pfconf" << EOF
# Default Deny Policy
block in all
# Skip the loop back interface
set skip on lo0
# Allowed inbound ports
pass in quick on $if proto tcp to any port $allowed_ports keep state
EOF
}
#----------------------------------------------------------#
# Global Variables #
#----------------------------------------------------------#
pfconf="/var/client/pf.conf"
#----------------------------------------------------------#
# Start Workflow #
#----------------------------------------------------------#
# Check if firewall is enabled and enable if needed
enable_firewall
# Get VPN connection status
check_VPN_status
if [[ $vpn_status == "connected" ]]; then
# If connected to VPN, create pf.conf and enable pf
create_pf_conf
/sbin/pfctl -e -f $pfconf
else
# If disconnected from VPN, disable pf
/sbin/pfctl -d
fi
}
EOF
/bin/echo "hi"
test```
답변1
EOF 대신 다른 "식별자"를 외부 구분 기호로 사용하십시오.
cat > /users/shared/test.sh << ABC
# ... inner heredoc using EOF goes here...
ABC
문서를 참조하세요:https://tldp.org/LDP/abs/html/here-docs.html
"명령 목록 어디에도 나타나지 않아 혼란을 야기할 만큼 특이한 제한 문자열을 선택하십시오."라고 나와 있습니다.
답변2
분명히 이미 여러 개의 heredoc이 서로 중첩되어 있으므로 각 문서에 이름이 지정된 EOF
태그 구분 기호의 고유한 세트를 제공해야 합니다. 그런데, "EOF"라고 부를 필요는 없습니다. 시작 및 끝 문자열이 일치하고 모든 끝 구분 기호가 들여쓰기되지 않은 한(코드의 마지막 구분 기호와는 달리) 어떤 문자열이든 가능합니다.