シェルスクリプトに挑戦しよう(9)制御構文[その2]――caseによる条件分岐“応用力”をつけるためのLinux再入門(29)(2/2 ページ)

» 2018年11月21日 05時00分 公開
[西村めぐみ@IT]
前のページへ 1|2       

パターン指定のバリエーション

 パターンの部分には「*」の他、「?」(任意の1文字)や「[〜]」([]内のいずれか1文字、範囲指定も可能)を使うことができます。

 「[]」を使って、「y」と「n」それぞれ、大文字と小文字のどちらでも指定できるようにすると以下のようになります。パターン指定なので、「"y"」のような引用符は不要である点に注意してください。

#! /bin/bash
case "$1" in
  [Yy])		#Yまたはy(パターン指定なので引用符は付けない)
    echo "YES"
    echo "OK"
    ;;
  [Nn])		#Nまたはn
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲yとnを大文字と小文字に対応させた(showyesnoを加工)
$ ./showyesno y
YES
OK
#(引数が「y」だったので「YES」と「OK」が表示された)
$ ./showyesno Y
YES
OK
#(引数が大文字の「Y」でも「YES」と「OK」が表示された)
▲実行結果(showyesno)

●複数のパターンを組み合わせる

 複数のパターンを使いたい場合は「|」で区切って並べます。例えば、「Y」「y」の他に「yes」でも指定できるようにするならば、「[Yy]|"yes"」のようにします。

#! /bin/bash
case "$1" in
  [Yy]|"yes")		#Y、yまたはyesという文字列
    echo "YES"
    echo "OK"
    ;;
  [Nn]|"no")		#N、nまたはnoという文字列
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲大文字と小文字の「y」と「n」の他、「yes」「no」にも対応した(showyesnoを加工)○●全ての大文字と小文字の区別をなくす

 先ほどの例では「yes」には対応しましたが、「YES」や「Yes」には対応していません。

 少々読みにくくなりますが、「[Yy][Ee][Ss]」のように書くことで、大文字と小文字に対応させることができます。これは、1文字目が「Y」または「y」、2文字目が「E」または「e」、3文字目は「S」または「s」という意味です。また、1文字だけで「Y」または「y」というのも有効にしておきたいとすると、次のようになります。

#! /bin/bash
case "$1" in
  [Yy]|[Yy][Ee][Ss])
    echo "YES"
    echo "OK"
    ;;
  [Nn]|[Nn][Oo])
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲大文字と小文字の「y」「yes」「n」「no」に対応した(showyesnoを加工)

●シェルオプションで大文字と小文字の区別をなくす

 大文字と小文字の区別をなくすシェルオプション「nocasematch」を有効にすると、case文のパターン判定でも大文字と小文字が区別されなくなります。

 ここではシェルスクリプトの先頭で、「shopt」コマンド(bashの組み込みコマンド)で「nocasematch」を有効にしています。この設定はシェルスクリプトの中でのみ有効です。

#! /bin/bash
shopt -s nocasematch		#大文字と小文字を区別しない
case "$1" in
  "y"|"yes")
    echo "YES"
    echo "OK"
    ;;
  "n"|"no")
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲シェルオプションで大文字と小文字の区別をなくした(showyesnoを加工)

●大文字と小文字を統一してから比較する(コマンド実行結果によるパターン分岐)

 元の文字列(ここでは$1)を、いったん全て大文字または小文字に変換した上で比較するという方法もあります。

 例えば、「tr」コマンドならば、「tr A-Z a-z」で大文字を全て小文字に、「tr a-z A-Z」で小文字を全て大文字に変換できます。

 trコマンドは標準入力から受け取った文字列を処理するので、echoコマンドとパイプでtrコマンドに渡します。具体的には「`echo $1|tr A-Z a-z`」のように指定します。

 このように、case文とバッククオートを組み合わせることで、コマンドの実行結果を使ってパターン分岐させることができます。

#! /bin/bash
case `echo "$1"|tr A-Z a-z` in		#引数を小文字に変換
  "y"|"yes")
    echo "YES"
    echo "OK"
    ;;
  "n"|"no")
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲trコマンドで引数を全て小文字にした(showyesnoを加工)

●bashの変数展開で大小文字を統一してから比較する

 bashのバージョン4以降の場合、「${変数名^^}」で全て大文字、「${変数名,,}」で全て小文字、のような値の取得が可能です。

 そこで、trコマンドを使わなくても、以下のようにすることで引数を小文字に統一できます。

#! /bin/bash
case ${1,,} in			#引数を全て小文字で取得
  "y"|"yes")
    echo "YES"
    echo "OK"
    ;;
  "n"|"no")
    echo "NO"
    ;;
  *)
    echo "undefined";;
esac
▲${変数名,,}で引数を全て小文字にした(showyesnoを加工)

 この他にも以下のような指定方法があります。全体を変更するものと、先頭文字だけを変更(2文字目以降には何もしない)するものがあります。

●指定方法と結果
指定方法 意味 変換例
ABC abc Abc aBC
${変数名^} 1文字目だけ大文字にする ABC Abc Abc ABC
${変数名^^} 全て大文字にする ABC ABC ABC ABC
${変数名,} 1文字目だけ小文字にする aBC abc abc aBC
${変数名,,} 全て小文字にする abc abc abc abc
${変数名~} 1文字目だけ大文字小文字を反転させる aBC Abc abc ABC
${変数名~~} 大文字小文字を全て反転させる abc ABC aBC Abc

筆者紹介

西村 めぐみ(にしむら めぐみ)

もともとはDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの“PCヘルパー”やピンポイント研修なども行っている。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。