2

事前に計算されたコンポーネントからログ メッセージを作成するこの変数の割り当てを引用していただけますか?

formatted_message=$(printf '%s [PID %s] %s (%s) %s:%s | %s\n' \
                           "${TIMESTAMP}" \
                           "${PROCESS}" \
                           "${SEVERITY}" \
                           "${SOURCE}" \
                           "${FUNCTION}" \
                           "${LINE}" \
                           "${MESSAGE}")

これは実際に優れた Bash プログラミング スタイルですか?

私はいくつかのBashを学ぼうとしていますが、「非効率的」だと思うものがあります:

  • さまざまなコンテキストで引用符が何を意味するかについて非常に多くのルールがある場合、コンテキストであるいくつかの暗黙のルールを適用して、読み取ったコードを (「マインド コンパイラ」を使用して) 継続的に解析し、再読み取りし、再読み取りする必要があります。特定の (たとえば、式の左側、右側、配列に適用される展開とスカラー値など) であり、少なくとも私にとっては精神的に面倒です。私の単純な世界観では、固定された規則と単純な例外があると、コードをより速く読むことができ、コードを書くときに1文字か2文字余分に書くことができますが、一般的なケースでは非常に「自動的に」、特に例外をより多く認識できます。簡単に。

「ベストコーディングプラクティス」について私をこの混乱状態に陥らせた例を見てみましょう:

[[ $x == "$x" ]]

動作に実際の変更を加えることなく、左側の引用符を省略できます.評価の右側に引用符を追加すると、重要な効果があります。突然、私はプロセス置換と「評価/置換」の他のすべてのコンテキストについて疑問に思い、いくつかの例外を除いて、それを行う簡単な方法が 1 つあればいいのにと思います。

これに関するガイド記事/ブログ投稿があれば、私はそれを詳細に研究し、実際のBash プログラマーが引用符を特定の位置に置いたり省略したりするときに伝えたいことを(できれば) 理解するようになります。

注: 私の学習は夜間の料金所で行われます。私の見解を比較できるプログラマー仲間は、皆さん以外にここにはいません。一部のオープンソース コードは、「コーディング スタイル」のように微妙な選択を正当化するコメントを伴わずに、「ただそこに」あります。

別のポイント:常に入力する方が簡単だと思います:

printf "${my_string_var}"

もちろん、これも問題ありません。

printf "$my_string_var"

(たまたま、変数展開をよりよく「見る」ことができます{})

しかし、これは単語分割された変数の内容とはおそらく同等ではありません (?!)

printf $my_string_var # with $my_string_var := 'foo bar'

概要

シンプルで率直な質問に 1 つだけ答えて、「議論」を避けたい場合は、次のようにします。

  • 上記の最初の課題を引用しますか? なんで?

注:私の問題の1つは、あちこちに二重引用符を入れようとしても、最後のもの\n が消え$()てしまうことでした..しかし、今ではそれが取り除かれることを理解しています..

4

1 に答える 1

1

通常の理由 (不注意な単語分割から保護するため) は変数代入の RHS には適用されないため、右側は引用しません。

bash4 以降を使用している場合は、割り当てを完全に省くことができます。それに加えて、パラメーター展開演算子を適用したり、隣接する文字からパラメーター名を分離したりするために中かっこが必要ない場合、中かっこは不要で気を散らすものだと思います。もちろん、引用は依然として重要です。

printf -v formatted_message '%s [PID %s] %s (%s) %s:%s | %s\n' \
                       "$TIMESTAMP" \
                       "$PROCESS" \
                       "$SEVERITY" \
                       "$SOURCE" \
                       "$FUNCTION" \
                       "$LINE" \
                       "$MESSAGE"
于 2013-03-23T13:31:55.250 に答える