IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第37回 bashの組み込みコマンドついて知ろう(5) (宮崎悟) 2021年12月

前回は、bashのジョブ制御関連の組み込みコマンドについて説明しました。今回は、文字列を出力するbashの組み込みコマンドについて説明します。

echo [-neE] [arg ...]

スペースで区切られた引数 args を出力し、その後に改行を出力します。 書き込みエラーが発生しない限り、戻り値は 0 です。

-nが指定された場合、最後の改行は出力されません。

-e オプションが指定された場合、以下のバックスラッシュエスケープされた文字の解釈が有効になります。 -E オプションは、これらのエスケープ文字がデフォルトで解釈されるシステムであっても、その解釈を無効にします。 xpg_echo シェルオプションを使用すると、 echo がこれらのエスケープ文字をデフォルトで展開するかどうかを 動的に決定できます。 echo は -- をオプションの終了を意味しません。 echoは、以下のエスケープシーケンスを使用できます。

エスケープシーケンス 意味
\a 警告(ベル)
\b バックスペース
\c 行末に改行を付けない
\e、\E エスケープ文字
\f フォームフィード
\n 改行(Line feed)
\r 復帰(carriage return)
\t 水平タブ
\v 垂直タブ
\\ バックスラッシュ
\0nnn 8進数でnnnである8bit文字(8進数で0~3桁)
\xHH 16 進数で HH である 8 ビット文字 (16 進で 1〜2 桁)
\uHHHH 16 進数で HHHH であるUnicode (ISO/IEC 10646) 文字 (16 進 1〜4 桁)
\uHHHHHHHH 16 進数で HHHHHHHH であるUnicode(ISO/IEC 10646) 文字 (16 進 1〜8 桁)。

以下は、echoの使用例です。

# 無指定の場合、改行が末尾に入ります。
$ echo aaa
aaa
# 改行されていないため、echoした文字列の直後にプロンプト($ )が表示される。
$ echo -n aaa
aaa$                
$ echo -n "aaa\c"
aaa$
# \n(LF)は通常Linuxで使用される改行コード。\r\nは、Windowsやネットワークプロトコルで使用される改行コード。
# Linux上では、\rは通常表示されない
$ echo -ne "aaa\r\n"
aaa
# 水平タブは通常のタブキーで入力される文字列です。
$ echo -e "aaa\tbbbb\tccc"
aaa     bbbb    ccc
# 垂直タブは、以下のように表示されます。
$ echo -e "aaa\vbbbb\vccc"
aaa
   bbbb
       ccc
# 8進数での文字列表示
$ echo -e "\0117\0143\0164\0141\0154"
Octal
# 16進数での文字列表示
$ echo -e "\x48\x65\x78\x64\x65\x63\x69\x6d\x61\x6c"
Hexdecimal
# 16進数でのUnicode文字列
echo -e '\u0055\u0054\u0046\u002d\u0038\u6587\u5b57\u5217'
UTF-8文字列
printf [-v var] format [arguments]

引数で指定したformatの制御下で、引数(arguments)を標準出力に書き込みます。-vオプションを付けると、標準出力に出力するのではなく、変数varに代入されます。

引数formatは文字列であり、次の3種類のオブジェクトを含んでいます。

  • 標準出力に単純にコピーされるプレーン文字
  • 変換されて標準出力にコピーされる文字エスケープシーケンス
  • 次の連続した引数の印刷を引き起こすそれぞれのフォーマット指定

標準的な printf コマンドの書式指定に加えて、組み込みコマンドprintf は以下の拡張書式を指定できます。

書式 説明
%b 対応する引数のバックスラッシュエスケープシーケンスを、echo -eと同じように展開します。
%q 対応する引数をシェルの入力として再利用可能な形式で出力します。
%(datefmt)T datefmtをstrftime(3)のフォーマット文字列として使用した結果、printfに日付時間文字列を出力します。
対応する引数は、エポックからの秒数を表す整数です。 2つの特別な引数値を使用することができます。
-1は現在の時刻を表し、-2はシェルが起動された時刻を表します。
引数が指定されない場合,-1が与えられたのと同じ動作します。

標準的なprintf コマンドの書式は、man printfもしくはman -s 3 printf コマンドで確認できます。printfの書式は%から始まる文字で、以下でいくつか説明します。

書式 説明
d, i 数字の引数を、符号(+-)付き10進数表記で出力する。
o 数字の引数を、符号(+-)なし8進数表記で出力する。
u 数字の引数を、符号(+-)なし10進数表記で出力する。
x, X 符号なし16進数 (x と X) に変換する。
xでは10以上の数値が"abcdef"と小文字で表示され、Xでは"ABCDEF"と大文字で表示される。
e, E 浮動小数点の引き数を丸めて [-]d.ddde±dd の形に変換する。e と E の違いは、e±の表記が小文字/大文字かである。
これで出力されるのは、10進数で最初の1桁の数値で、それ以降の小数点以下の数値と、±以下の10のdd乗で表示する。
小数点以下の精度は、%の次に.9のように有効桁を数字で表記し、デフォルト値は6である。
f, F 浮動小数点の引き数を丸めて [-]ddd.ddd の形に変換する。小数点以下の精度指定は e, E と同じである。
g, G 浮動小数点の引数を丸めて、f か e (G 変換の場合は F か E) の形式に変換する。
小数点以下が4桁より大きいか、指定した精度より少ない場合、e, E 形式に変換し、それ以外では、f, F 形式に変換する。
a, A 浮動小数点の引き数を丸めて、 [-]0xh.hhhhp± 形式の 16 進表記に変換する。表示形式は、e, E 形式と同じである。
精度指定は指定できない。
c 数字の引数を、ASCII文字に変換する
s 指定した引数を、文字列として出力する。

文字列以外のフォーマット指定子の引数は、Cの定数として扱われますが、先頭にプラスかマイナスの記号を付けることができます。先頭の文字がシングルクォートかダブルクォートの場合、その値は次の文字のASCII値となります。

フォーマットは必要に応じて再利用され、すべての引数を使用します。 フォーマットが指定された以上の引数を必要とする場合、ゼロ値やヌル文字列が指定されたかのように振る舞います。 戻り値は、成功した場合はゼロ、失敗した場合はゼロ以外です。

# 符号付き整数と符号なし10進数整数
$ printf "%d\n" -100
-100
$ printf "%u\n" -100
18446744073709551516
# 符号なし8進数整数
$ printf "%o\n" 100
144
# 符号なし16進数整数
$ printf "%x\n" 100
64
$ printf "%x\n" -100
ffffffffffffff9c
# 浮動小数点
$ printf "%e\n" 123456789.123456789012345678901234567890123456789
1.234568e+08
$ printf "%f\n" 123456789.123456789012345678901234567890123456789
123456789.123457
$ printf "%g\n" 123456789.123456789012345678901234567890123456789
1.23457e+08
$ printf "%a\n" 123456789.123456789012345678901234567890123456789
0xe.b79a2a3f35ba6e9p+23
# 複数の引数、時間フォーマットの使用
$ printf "ID-%s-%d\t%(%c)T\t%d%s\n" aaa 100 -1 20 個
ID-aaa-100      2021年11月10日 14時18分14秒     20個
# フォーマットで指定した引数より、引数が足りないときは0もしくは空文字として扱われる
$ printf "ID-%s-%d\t%(%c)T\t%d%s\n" aaa 100 0
ID-aaa-100      1970年01月01日 09時00分00秒     0
終わりに

今回は、文字列を出力するbashの組み込みコマンドについて説明しました。次回も、bashの組み込みコマンドについて説明を続けます。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes