つまり、printf %100s
は100個のスペースを印刷し、tr " " "="
それらのスペースを等号に変換して、100個の等号を効果的に印刷します。
それを分解する:
printf
組み込みシェルです。通常、2つ以上の引数を受け取ります。最初の引数は「フォーマット文字列」で、残りはそのフォーマット文字列のプレースホルダーを埋めるために使用されます。テンプレートが完全に入力されると、結果が出力されます。引数が残っている場合は、最初からやり直して、さらに引数を入力し、結果の文字列を出力します。
使用されるフォーマット文字列は、1文字printf
で始まり%
、1文字で終わるフォーマット指定をとるので%d
、整数(10進数を使用するため、「d」を使用)、%f
浮動小数点数%s
、文字列を意味します。の後の文字以外の文字%
は、フォーマット指定の修飾子であり、特に数値は、出力時にフィールドの要求された長さを指定するために使用されます。したがって%100s
、文字列は少なくとも100文字になるようにフォーマットされ、スペースが埋め込まれ、正しい位置に維持されます(つまり、文字列の先頭にスペースが追加されます)。
追加の引数が渡された場合、その%s
フィールドに使用されるため、たとえば、printf %100s abc
97のスペース(「abc」の3を考慮して合計100になる)の後に実際の文字列「abc」が続きます。ただし、引数が指定されていない場合、フォーマット指定は空またはnull引数(の場合は空の文字列%s
、の場合は0になります%d
)で埋められます。したがって、次のように空の文字列が渡された場合と同じです。printf %100s ''
。その結果、100文字のパディングのみが印刷されます。
したがって、すべてをまとめるとprintf %100s
、100スペースが印刷されます。
これtr
は、文字を入力から出力に変換するツールです。2つの引数SET1とSET2をそれぞれ文字のセットとして受け取り、SET1の最初の文字をSET2の最初の文字に変換し、SET1の2番目の文字をSET2の2番目の文字に変換します。tr
stdinから入力を読み取り、それをstdoutに書き戻します(そのため、上記のようなパイプラインで非常に役立ちます)tr
。指定された文字列内のその文字のすべての出現を常に変換します。
たとえば、tr aeiou 12345
は小文字の母音を1から5の番号にこの順序で変換するため、「queueing」は「q52523ng」などに変換されます。tr a-z A-Z
小文字を対応する大文字に変換するなど、文字範囲を渡すこともできます。
だから、tr " " "="
単純に文字列全体に等号にスペースを翻訳しています。最初のスペースは、引数として認識されるように引用符で囲む必要があります。=
実際にはありません必要クオートするが、これは悪くはありません。tr " " =
同じように機能します。
すべてをまとめて、100スペースを印刷してから、それぞれを等号に変換します。
うまくいけば、これで十分に詳細に説明できますが、それでも理解できないことがある場合は、コメントを残してください。
printf '%100s' ' ' | tr " " "="