web-dev-qa-db-ja.com

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

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

#/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に正しく渡さないのですか?私はこれにかなり新しいです。

2
Kylar Stern

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

文字列の存在をテストする必要はありませんが、そうする場合は、grepを置換する正しい方法output"$(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

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

3
steeldriver