行をコメントアウトまたはコメント解除するシェルスクリプト-テスト


2

#ファイルの単一行から記号を削除しようとしています。行は現在

#/usr/bin/tvservice -o
if [[ '$grep tvservice /etc/rc.local' =~ ^# ]] ;
then sed -i '/^#.* tvservice /s/^#//' /etc/rc.local ;
else echo 1 fi

スクリプトに追加する前に、このコマンドが機能するかどうかをテストしてみます。実行すると、>シンボルが取得され、Ctrl+で実行を停止する必要がありますC

文字列をgrep正しく渡さないのですか?私はこれにかなり新しいです。

回答:


3

最初にsedのフラグなしでテストする-iか、rc.localファイルのローカルコピーを使用することをお勧めします。

文字列の存在をテストする必要ありません、そうする場合、grepの出力を置換する正しい方法は"$(grep tvservice /etc/rc.local)"-文字列をテストして書いた方法です$grep tvservice /etc/rc.local

ただし、IMHOのより良い方法は、パターン全体をgrepし、grepの終了ステータスを直接使用して、シェルの正規表現テストを完全に回避することです。

if grep -q '^#.*tvservice' /etc/rc.local; then 
  sed -i '/^#.*tvservice/ s/^#//' /etc/rc.local
else 
  echo 1
fi

(サンプルテキストにスペースがないため、パターンの周りのスペースを削除しました)。


ええ、私よりほんの1分速い…
バイト司令官

このフォームでコマンドを実行しましたが、出力として2を取得しましたが、その後何も取得しません。実際にスクリプトを適切に終了しない、手がかりはありますか?if grep -q '^#/ * tvservice' /etc/rc.local; 次にecho 1 sed -i '/^#.*tvservice/ s / ^#//' /etc/rc.local else echo 2 sed -e '/ tvservice / s / ^#* /#/' fi
Kylar Stern

これは、現在のファイルの状態です{code}#!/ bin / sh -e##rc.local##このスクリプトは、各マルチユーザーランレベルの最後に実行されます。#成功した場合はスクリプトが「終了0」になり、エラーが発生した場合は他の値が#出るようにします。##このスクリプトを有効または無効にするには、実行ビットを変更します。##デフォルトでは、このスクリプトは何もしません。#Disable HDMI#/ usr / bin / tvservice -o exit 0 {code}
Kylar Stern

2番目のsedでは、編集するファイルを指定しませんでした。コマンドが実行されて終了するのを修正しましたが、出力として「2」を取得します。つまり、その行から#を削除するはずの「then」をスキップします。
Kylarスターン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.