问题就在这里。
我正在尝试以“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 命令中转义了双引号。
就是这样!