English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
前章ではShellのechoコマンドについて学びました。本章ではShellの別の出力コマンドであるprintfについて学びましょう。
printfコマンドはCプログラムライブラリ内のprintf()関数を模倣しています。
printfはPOSIX標準に定義されており、そのためprintfを使用するスクリプトはechoを使用するスクリプトよりも移植性が良くなります。
printfは参照テキストまたはスペースで区切られたパラメータを使用し、外部でフォーマット化された文字列を使用できます。また、文字列の幅や左寄せ、右寄せなどの設定も可能です。デフォルトではprintfはechoのように自動的に改行符を追加しません。\nを手動で追加できます。
printf コマンドの構文:
printf format-string [arguments...]
パラメータ説明:
format-string: はフォーマット制御文字列です。
arguments: は引数リストです。
$ echo "Hello, Shell" Hello, Shell $ printf "Hello, Shell\n" Hello, Shell $
次に、printfの強大な機能を示すためにスクリプトを使います:
#!/bin/bash # author:基本チュートリアルサイト # url:ja.oldtoolbag.com printf "%%-10s %%-8s %%-4s\n" 姓名 性別 体重kg printf "%%-10s %%-8s %%-4.2f\n" 郭靖 男です 66.1234 printf "%%-10s %%-8s %%-4.2f\n" 楊過 男です 48.6543 printf "%%-10s %%-8s %%-4.2f\n" 郭芙 女です 47.9876
スクリプトを実行し、以下の結果を出力します:
姓名 性别 体重kg 郭靖 男 66.12 楊過 男 48.65 郭芙 女 47.99
%s %c %d %f はフォーマット置換文字です、%s 文字列を出力する、%d 整数を出力する、%c 文字を出力する、%f 実数を出力し、小数形式で出力します。
%-10s は幅が 10 文字(- を表示します(左寄せ、指定しない場合は右寄せ)、どんな文字も 10 文字幅の文字内で、不足すると自動的にスペースで埋め尽くし、超えるとすべての内容が表示されます。
%-4.2f は小数形式にフォーマット化する、その中で .2 指2桁小数。
#!/bin/bash # author:基本チュートリアルサイト # url:ja.oldtoolbag.com # format-string はダブルクォートで囲まれています printf "%d %s\n" 1 "abc" # スラッシュで囲まれた引数とダブルクォートで囲まれた引数の効果は同じです printf '%d %s\n' 1 "abc" # 引用符はなくても出力できます printf %s abcdef # フォーマットには1つのパラメータが指定されていますが、余分なパラメータもそのフォーマットに従って出力されます,format-string が再利用されます printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 引数がなければ、%s は NULL で置き換え、%d は 0 で置き換えます printf "%s and %d \n"
スクリプトを実行し、以下の結果を出力します:
1 abc 1 abc abcdefabcdefabc def a b c d e f g h i j and 0
シーケンス | 説明 |
---|---|
\a | 警告文字、通常はASCIIのBEL文字 |
\b | バックスペース |
\c | 出力結果の最後に終わりのカラムを抑制(表示しない)(%b フォーマット指示子制御下のパラメータ文字列中のみ有効) |
\f | フォームフィード(Formfeed) |
\n | 改行 |
\r | キャリッジリターン(Carriage return) |
\t | 水平タブ |
\v | 垂直タブ |
\\ | 文字的な反斜線文字 |
\ddd | を表す1から3桁の8進数値の文字。フォーマット文字列中のみ有効 |
\0ddd | を表す1から3の8進数値文字 |
$ printf "a string, no processing:<%s>\n" "A\nB" a string, no processing:<A\nB> $ printf "a string, no processing:<%b>\n" "A\nB" a string, no processing:<A B> $ printf "ja.oldtoolbag.com \a" ja.oldtoolbag.com $ #改行せず