このコンテンツがファイルにまだ存在しない場合にのみ、ここにあるドキュメントの内容をファイルに追加してください。

このコンテンツがファイルにまだ存在しない場合にのみ、ここにあるドキュメントの内容をファイルに追加してください。

一部のコンテンツ(下のコードに表示される最初、2番目、3番目のスペースを含む)を追加したいファイルがあります。

###私はテキストメッセージ1です

###私はテキストメッセージ2です

(私が添付した実際のテキストはこの5行よりはるかに長いです。)

単にファイルにコンテンツを追加するには、次の手順を実行します。

cat <<-"EOF" >> myPath/myFile
    content...
EOF

しかし、ファイルにコンテンツがまだ存在しない場合にのみ、ここにドキュメントにコンテンツを追加させるにはどうすればよいですか?それ以外の場合、ジョブは中断されます。

ファイルに部分ブロックの内容しかない場合は、操作全体を中断する必要があります。

答え1

文書がない場合にのみここに文書を追加する場合は、次のものを使用できますgrep

cat <<-"EOF1" > myPath/myFile.append
    content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
    cat myPath/myFile.append >> myPath/myFile
fi

これを理解するには、次の点を考慮してください。

  • grep -F -q -f myPath/myFile{.append,}シェルに拡張されましたgrep -F -q -f myPath/myFile.append myPath/myFile

  • このgrepコマンドは、myPath/myFile(追加するテキストを含むファイル)-Fに含まれる固定文字列()を検索し(必要に応じてmyPath/myFile.appendテキストを追加する必要があるファイル)、-f1行に1つのパターン()を読み取り、固定文字列を見つけた場合にのみ表示します。します。文字列():そうです。終了コード、出力なし(-q)。

  • その後、結果は反転され、!何も見つからなかった場合にのみブロックの一部が実行されますifthengrep

答え2

この答えを承認しないでください。しかし、Stephenの答えを正しいとマークしました。これは私が読みやすく変形したものです。


テンプレートファイルの内容が最終ファイルにまだ存在しない場合にのみ最終ファイルに追加する必要がある場合は、次のものを使用できますgrep

cat <<-"EOF1" > myPath/myTemplate
    content...
EOF1

if ! grep -F -q -f myPath/myFile myPath/myTemplate; then
    cat myPath/myTemplate >> myPath/myFile
fi

このコマンドは()grepに含まれるmyPath/endFile.sh固定文字列を検索し、1行に1つのパターンを読み取り()のみを渡します。-FmyPath/myTemplate-f終了コード、出力なし(-q)。

その後、結果が反転して!最終ファイル内のどの項目とも一致しない場合にのみthenブロックが実行されます。if-thengrep

付録 - 終了コード:

プロセスが終了すると、小さな整数である終了コードを返します。通常、終了コード 0 は成功を示し、0 でない場合は失敗またはエラーを示します。

  • grep一致するものがある場合は0を返し、一致するものがない場合は1を返します。

  • if引数の終了コードを使用して、実行するアクションを決定します。 0の場合はブロックを処理しthen、それ以外の場合はelseブロック(存在する場合)を処理します。

  • 句読点(!)は反転できます。このthenブロックは、grepが何も一致しない場合(またはエラーが発生した場合)にのみ実行されます。

関連情報