Bashスクリプトで文字列を正しくラップしてリンクする方法

Bashスクリプトで文字列を正しくラップしてリンクする方法

時間と状態でメッセージを記録する機能を持つBashスクリプトがあり、スクリプトの80列だけを保持したいと思います。

#!/bin/bash

log_message() {
  echo "[$(date)]-[$1] : $2" >> log.txt
}

varName="John Doe"

# line break to not exceed 80 columns
log_message "WARNING" "I am "${varName}" and i want to limit this line \
to 80 columns"

ログファイルの結果が予想と異なります。

[Fri Jun 24 13:50:12 CEST 2022]-[WARNING] : I am John

Bashでこれを行う正しい方法は何ですか?

ベストアンサー1

あなたの場合、問題は行の連続にあるのではなく、2番目のパラメータに二重引用符をエスケープせずに使用しているという事実にあります(@Stéphaneの答えを見ると、実際にこれを意図したかもしれません。これが良い考えではない理由については、以下を参照してください。)。試してみてください

log_message "WARNING" "I am \"${varName}\" and i want to limit this line \
to 80 columns"

以前にエスケープされていない引用符を使用した変数参照${varName}は、実際には外部二重引用符とスプレーしたがって、log_message呼び出しには次のパラメータが表示されます。

  • WARNING
  • I am John(そのJohn部分は「閉じる」二重引用符の直後にあるため、まだ2番目のタグの一部と見なされます。)
  • Doe and i want to limit this line to 80 columnsDoe2番目のパラメータと同じ理由で3番目のパラメータに追加)John

ただし、関数はlog_message最初の2つの引数のみを解釈するため、残りの文字列フラグメントは失われます。

おすすめ記事