Mac のデフォルトの状態で bash スクリプトで大文字←→小文字に変換したいのです。
一般的な Linux であれば、以下のように変数の展開時に ,,
もしくは ^^
を使うと全て小文字・大文字にできます。
s='Hoge FUGA';
echo "${s,,}" # 小文字になる → hoge fuga
echo "${s^^}" # 大文字になる → HOGE FUGA
これは Bash v4+ での機能です。
しかし、macOS HighSierra 〜 Catalina(OSX 10.13.6〜10.15.7)のデフォルトの bash
のバージョンは v3.2.57
であるため、${input^^}
が使えません。しかも、Mac の sed コマンドは BSD 版 sed なのです。
つまり、デフォルトで GNU sed
の sed \L
オプションや ${input^^}
や capitalize -u
などで簡単に大文字化・小文字化できないのです。
問題は、諸事情で Homebrew などで GNU sed や bash v4+
がインストールできないのです。T^T
小文字から大文字に変換する7つの方法
🐒 下記の方法は、いずれも
$input
をリダイレクト(<<<
)で渡していますが、パイプ渡しでも動きます。echo $input | tr '[a-z]' '[A-Z]'
変数に入れる場合は、パイプ渡しの方が直感的かもしれません。input_lowercase=$(echo "${input}" | tr '[a-z]' '[A-Z]')
# !/usr/bin/env bash
INPUT='hoge'
tr '[a-z]' '[A-Z]' <<< $INPUT
tr '[:lower:]' '[:upper:]' <<< $INPUT
awk '{print toupper($0)}' <<< $INPUT
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' <<< $INPUT
php -r "echo strtoupper('$INPUT'), PHP_EOL;"
python -c "print('$INPUT'.upper())"
perl -ne 'print uc' <<< $INPUT
$ ./LowerToUpper.sh
HOGE
HOGE
HOGE
HOGE
HOGE
HOGE
HOGE
大文字から小文字に変換する7つの方法
# !/usr/bin/env bash
INPUT='HOGE'
tr '[A-Z]' '[a-z]' <<< $INPUT
tr '[:upper:]' '[:lower:]' <<< $INPUT
awk '{print tolower($0)}' <<< $INPUT
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' <<< $INPUT
php -r "echo strtolower('$INPUT'), PHP_EOL;"
python -c "print('$INPUT'.lower())"
perl -ne 'print lc' <<< $INPUT
$ ./UpperToLower.sh
hoge
hoge
hoge
hoge
hoge
hoge
hoge
応用技
bash で yes
no
判定にも使えます。つまり、小文字で yes
と入力しても YES
と検知できます。
# !/usr/bin/env bash
read -p 'ミキミキツンパカルテイハ? (y/n): ' INPUT
INPUT=$(tr '[a-z]' '[A-Z]' <<< $INPUT)
if [ ${INPUT:0:1} = 'Y' ] ; then
echo 'Really?'
else
echo 'N...No?'
fi
$ ./sample.sh
ミキミキツンパカルテイハ?(y/n):yeeeeees
Really?
参考文献
- uppercase to lowercase in bash on a mac @ StackOverflow
-
How to convert a string to lower case in Bash?
@ StackOverflow - Bashで変数を大文字小文字変換(uppercase/lowercase)する @ Qiita