
それが問題だ。
「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のおかげで、ついにこの問題を解決しました。
まず、およびを2つの異なる変数に分割して読みやすさ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コマンドで二重引用符をエスケープしました。
それだけです!