Bash のビルトインコマンド “declare” の使い方紹介(その2:大文字小文字の自動変換)

2022-03-08Bash,CentOS,Cygwin,Linux,Ubuntu

以下のエントリの続き。

  1. シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに?
  2. Bash のビルトインコマンド "declare" の使い方紹介(その1)

前回まで見てきたオプションは、 変数の定義時に 型を指定 し、 想定通りの値が格納されていることを担保する ためのものです。
他の言語で言う 連想配列配列整数 の3つの型について取り扱いました。

今回紹介するのは 文字列型機能 について。

文字列型の変数に格納されている値が全て大文字であること、あるいは全て小文字であることを担保するためのオプションです。

検証環境

$ bash --version
GNU bash, バージョン 5.0.2(1)-release (x86_64-apple-darwin18.2.0)

declare オプション(変数の型を定義するもの)

-l オプション

大文字を自動的に小文字に変換する変数を定義。
LowerCase の頭文字からとっているのだろう。

変数への値には必ず小文字の英字しか格納されていないことが担保されます。

# 全て小文字は当然何も起こらない
$ declare -l LSTR=abcde
$ echo ${LSTR}
abcde

# 大文字の値を代入しても変換される
$ LSTR="Hello World"
$ echo ${LSTR}
hello world

# 大文字を含むと変換される
$ declare -l LSTR2=ABCDE
$ echo ${LSTR2}
abcde

# 他の文字が混ざっていても大文字は小文字に変換される
$ declare -l LSTR3=aB1C3DE
$ echo ${LSTR3}
ab1c3de

# 全角英大文字を混ぜてみたところ...なんということでしょう!
$ declare -l LSTR4=abCABC
$ echo ${LSTR4}
abcabc

驚いたのは全角英大文字もしっかり小文字に変換されていたことです。
Bash のバージョンによるのでしょうか?

(2020-01-17 追記) GNU bash, version 4.2.46 で試してみたところ全角英大文字は小文字になりませんでした。 ver5 以降の機能のようですね。

-u オプション

小文字を自動的に大文字に変換する変数を定義。
オプションの名前の由来は、当然 UpperCase の頭文字と推測。

変数への値には必ず大文字の英字しか格納されていないことが担保されます。

先ほどと同じコマンドを試してみます。

# 小文字を含むと変換される
$ declare -u LSTR=abcde
$ echo ${LSTR}
ABCDE

# 小文字の値を代入しても変換される
$ LSTR="Hello World"
$ echo ${LSTR}
HELLO WORLD

# 全て大文字は当然何も起こらない
$ declare -u LSTR2=ABCDE
$ echo ${LSTR2}
ABCDE

# 他の文字が混ざっていても小文字は大文字に変換される
$ declare -u LSTR3=aB1C3DE
$ echo ${LSTR3}
AB1C3DE

# やっぱり賢く変換してくれる
$ declare -u LSTR4=abCabc
$ echo ${LSTR4}
ABCABC

まとめ

文字列型 変数定義時の強化版機能について。

思ったより賢く、全角英字も変換してくれました。

もっとも Bash 上で全角文字を頻繁に大文字小文字変換するケースはほぼないでしょう(笑)

2022-03-08Bash,CentOS,Cygwin,Linux,Ubuntu