그것이 문제이다.
"root" 사용자로 "myusername" 사용자로 명령을 실행하려고 합니다.
그래서 나는 su - $USERNAME -c <command>
The <command>
자체를 다음과 같이 사용합니다.sudo sed -i 's|SEARCH_REGEX|REPLACEMENT|' /etc/cloud/cloud.cfg
REPLACEMENT
하지만 스크립트를 실행할 때마다 해당 부분 으로 인한 것으로 보이는 오류가 발생합니다 .
캐리지 리턴이나 공백에 관한 것 같아요.
코드는 다음과 같습니다.
#!/bin/bash
$USERNAME="myusername"
$USERPWD="p@ssw0rd123"
PATTERN='s|preserve_hostname:\sfalse|preserve_hostname: true\nmanage_etc_hosts: false|'
su - $USERNAME -c 'sudo -S bash -c "sed -i '$PATTERN' /etc/cloud/cloud.cfg"' <<< $USERPWD
내가 얻는 오류는 다음과 같습니다.
true\nmanage_etc_hosts:: -c: line 0: unexpected EOF while looking for matching `"'
true\nmanage_etc_hosts:: -c: line 1: syntax error: unexpected end of file
나에게 도움이 된 자료:
https://linuxize.com/post/how-to-use-sed-to-find-and-replace-string-in-files/
https://linuxhint.com/50_sed_command_examples/
내가 뭘 잘못했나요?
답변1
@Quasimodo 덕분에 마침내 이 문제를 해결했습니다.
먼저 및 를 두 개의 다른 변수로 분할 PATTERN
하여 가독성을 높였습니다. 그런 다음 기본적으로 내가 한 일은 작은 따옴표를 큰 따옴표로 또는 그 반대로 변경하는 것입니다.REGEXP
REPLACEMENT
REGEXP="preserve_hostname:\sfalse"
REPLACEMENT="preserve_hostname: true\nmanage_etc_hosts: false"
PATTERN="s/$REGEXP/$REPLACEMENT/"
su - $USERNAME -c "sudo -S bash -c 'sed -n -i \"$PATTERN\" /etc/cloud/cloud.cfg'" <<< $USERPWD
$PATTERN
sed 명령에서 큰따옴표를 이스케이프 처리했습니다.
그게 다야!