特定の書式文字列を使用するprintfショートカットコマンド

特定の書式文字列を使用するprintfショートカットコマンド

printf特定のフォーマット文字列でショートカットコマンドを使用したかったので、次のことを考えました。

local PF="printf %s\n"
$PF "Some Text"

これを行うが、このアプローチを使用するときに型文字列を誤って解釈する可能性がある注意事項があるかどうかを知りたいです。

答え1

  1. 関数のみを使用できますが、なぜ変数値を実行するのですか?それが関数の目的です。

    PF() { printf "%s\n" "$@" ; }
    PF "Some Text"
    

    またはエイリアス:

    alias PF='printf "%s\n"'
    PF "Some Text"
    
  2. 実際に変数を使用するには、その変数を使用して型文字列を保持します。例えば

    fmt="%s\n"
    printf "$fmt" "Some Text"
    

    行の長さを80文字未満に保つには、2つ以上のステートメントに変数を割り当てることができます。例えば

    fmt="......part1......"
    fmt+="......part2......"
    fmt+="......part3......"
    ...
    

    これは、割り当てられた書式文字列を読みやすくしたり、一部または全部のセクションに別々の説明を追加したい場合にも役立ちます。

答え2

リストコンテキストで$PF分割+globを呼び出します。コンテンツは、$PF特別なパラメータ(コードが解釈されたときに発生するものとは無関係)を含む複雑な規則に従って分割され、$IFS結果の単語はファイル名の生成(別名パス名拡張、別名ワイルドカード)の影響を受けます。bashprintf %s\n

したがって、ここには少なくとも2つの問題があります。

  1. の動作はの$PF現在の値によって異なります$IFS。デフォルトでは、bashスペース$IFS、タブ、および改行が含まれています。ここでは空白に分割したいと思います$PF。それ以外の場合、文字列にタブや改行は含まれません。ただし、たとえば変更さ$IFSれたコンテキストでは、引数を使用してコマンドを%実行します。"printf ""s\n"

  2. いくつかのbashバージョン(例:5.0、5.1で復元されたと思われる)では\ワイルドカードです(少なくともここではいくつかのパラメータ拡張に由来し、引用には使用されません)。

    オープンfailglobまたはnullglobオプションは、次のことを意味します。

    $ PF='printf %s\n' bash-5.0 -O failglob -c '$PF test'
    bash-5.0: no match: %s\n
    $ PF='printf %s\n' bash-5.0 -O nullglob -c '$PF test%d'
    test0
    

    これらのオプションがなくても:

    $ PF='printf %s\n' bash-5.0 -c '$PF test'
    test
    $ touch %sn
    $ PF='printf %s\n' bash-5.0 -c '$PF test'
    testn
    

バラより@casの素晴らしい答え実行する方法。

関連情報