기본적으로 파일의 문자열을 대체하는 내가 작성한 스크립트에서 명령을 실행하려고 합니다.
vzctl exec VZID sed -i 's/\/>/address="$IP\/255.255.255.0"\/\>/' "file.xml"
문제는 명령이 누락되어 있다는 것입니다 '
."
'
및를 유지하라는 명령을 피할 수 있는 방법이 있습니까 "
? 아니면 어떤 식으로든 캡슐화하나요?
답변1
아마도 이것은 vzctl exec
다음과 같습니다 eval
.껍데기명령줄은 받은 인수를 연결하여 생성됩니다. 따라서 유효한 쉘 명령줄을 인수로 전달해야 합니다. 이는 또 다른 수준의 인용을 의미합니다.
vzctl exec VZID '
sed -i '\''s/\/>/address="$IP\/255.255.255.0"\/\>/'\'' "file.xml"'
$IP
참고 하시기 바랍니다아니요확대됩니다. 이렇게 하려면 다음이 필요합니다.
vzctl exec VZID '
sed -i '\''s/\/>/address="'"$IP"'\/255.255.255.0"\/\>/'\'' "file.xml"'
명령을 해석하는 쉘을 통해 명령을 확장하려면 다음을 수행 vzctl
하십시오.
vzctl exec VZID '
sed -i '\''s/\/>/address="'\''"$IP"'\''\/255.255.255.0"\/\>/'\'' "file.xml"'
호출 셸에 의해 확장됩니다 vzctl exec
(셸이 해당 $IP
변수에 액세스할 수 있다고 가정).
명확성을 위해 여기에 있는 문서를 사용하고 코드를 변수에 저장하는 것이 더 쉬울 수 있습니다. 예를 들면 다음과 같습니다.
code=$(cat <<EOF
sed -i 's|/>|address="$IP/255.255.255.0"/>|' file.xml
EOF
)
(여기서 이 문서 형식은 변수를 확장합니다(여기 $ID
)).
다음과 같이 실행하십시오.
vzctl exec VZID "$code"
답변2
전체 명령을 따옴표로 묶고 백슬래시로 내부를 구분해 보셨나요?
내 말은:
vzctl exec VZID 'sed -i \'s/\/>/address=\"$IP\/255.255.255.0\"\/\>/\' \"file.xml\"'
작은 따옴표가 작동하지 않으면 큰 따옴표도 확인하겠지만 그렇게 해야 한다고 생각합니다.