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

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

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

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

第25回 bashの展開機能を知ろう(1) (宮崎悟) 2020年12月

前回は、WSL2で変わったネットワークについて説明しました。今回は、bashの機能説明に戻り、展開機能について説明します。

展開機能

展開機能(expansion)は、コマンド実行時に特殊な文字列を設定した際に、自動的に適用される機能です。

展開機能は7つあり、以下の順番で展開されます。

  1. ブレース展開
  2. チルダ展開
  3. パラメータと変数の展開、算術式展開
  4. コマンド置換
  5. 単語の分割
  6. パス名展開
ブレース展開

ブレース展開(brace expansion)は、任意の文字列を生成できます。ワイルドカードなどのパス名展開に似ていますが、ファイルが実在する必要はありません。ブレース展開は{}で囲んだ文字を使用して指定します。

シーケンス式による範囲指定

ブレース展開の範囲指定は{x..y}のように指定し、1文字+..+1文字の形式で指定する範囲の文字を、辞書順に文字列を列挙します。1番目に指定した文字が2番めに指定した文字より辞書順で大きい場合、自動的に逆順で列挙した文字列を展開します。指定できる文字は、アルファベット大小文字、整数で、アルファベットと数字を同時に指定することはできません。

$ echo abc{a..z}d
abcad abcbd abccd abcdd abced abcfd abcgd abchd abcid abcjd abckd abcld abcmd abcnd abcod abcpd abcqd abcrd abcsd abctd abcud abcvd abcwd abcxd abcyd abczd
$ echo abc{Z..A}
abcZ abcY abcX abcW abcV abcU abcT abcS abcR abcQ abcP abcO abcN abcM abcL abcK abcJ abcI abcH abcG abcF abcE abcD abcC abcB abcA
$ echo abc{0..3}
abc0 abc1 abc2 abc3
$ echo abc{a..3}
abc{a..3}

{a..z..9}のように、範囲指定のあとに数値nを指定できます。この数値は、範囲を列挙する際の差として扱います。省略時は1または-1となります。

$ echo abc{A..Z..2}d
abcAd abcCd abcEd abcGd abcId abcKd abcMd abcOd abcQd abcSd abcUd abcWd abcYd
$ echo abc{z..a..5}{0..9..3}
abcz0 abcz3 abcz6 abcz9 abcu0 abcu3 abcu6 abcu9 abcp0 abcp3 abcp6 abcp9 abck0 abck3 abck6 abck9 abcf0 abcf3 abcf6 abcf9 abca0 abca3 abca6 abca9
コンマ区切りによる指定

ブレース内にコンマ区切りの文字を指定することで、複数の文字列を展開できます。この展開は、指定したどおりに展開され、ソートされません。複数ディレクトリ・ファイルを指定するために、よく利用されます。

$ echo temp/{ZEF,abc,def}
temp/ZEF temp/abc temp/def
$ echo {あああ,いいい,えええ}
あああ いいい えええ
$ echo tmp/{c..e}{f..h}/{ZEF,abc,def}
tmp/cf/ZEF tmp/cf/abc tmp/cf/def tmp/cg/ZEF tmp/cg/abc tmp/cg/def tmp/ch/ZEF tmp/ch/abc tmp/ch/def tmp/df/ZEF tmp/df/abc tmp/df/def tmp/dg/ZEF tmp/dg/abc tmp/dg/def tmp/dh/ZEF tmp/dh/abc tmp/dh/def tmp/ef/ZEF tmp/ef/abc tmp/ef/def tmp/eg/ZEF tmp/eg/abc tmp/eg/def tmp/eh/ZEF tmp/eh/abc tmp/eh/def
$ mkdir -p temp/{c..e}{f..h}/{ZEF,abc,def}
$ find temp -type d |xargs ls -d
temp         temp/cg      temp/ch/ZEF  temp/df/abc  temp/dg/def  temp/ef      temp/eg/ZEF  temp/eh/abc
temp/cf      temp/cg/ZEF  temp/ch/abc  temp/df/def  temp/dh      temp/ef/ZEF  temp/eg/abc  temp/eh/def
temp/cf/ZEF  temp/cg/abc  temp/ch/def  temp/dg      temp/dh/ZEF  temp/ef/abc  temp/eg/def
temp/cf/abc  temp/cg/def  temp/df      temp/dg/ZEF  temp/dh/abc  temp/ef/def  temp/eh
temp/cf/def  temp/ch      temp/df/ZEF  temp/dg/abc  temp/dh/def  temp/eg      temp/eh/ZEF
$ echo /usr/{lib,share}/{go,[f-h]*}/{a*,b*,c*}
/usr/lib/go/api /usr/lib/go/bin /usr/lib/go/c* /usr/lib/go-1.13/api /usr/lib/go/api /usr/lib/go-1.13/bin /usr/lib/go/bin /usr/lib/gettext/cldr-plurals /usr/share/go/api /usr/share/go/b* /usr/share/go/c* /usr/share/fwupd/add_capsule_header.py /usr/share/gdb/auto-load /usr/share/go-1.13/api /usr/share/go/api /usr/share/[f-h]*/b* /usr/share/fontconfig/conf.avail /usr/share/fonts/cMap /usr/share/fonts/cmap /usr/share/gettext/config.rpath /usr/share/git-core/contrib /usr/share/groff/current

コンマ区切りした文字列にワイルドカードを指定することも可能です。以下の例では、ワイルドカードマッチしないファイル名はf*のように表示されます。

$ echo /usr/{lib,share}/{go,[f-h]*}/{a*,f*}
/usr/lib/go/api /usr/lib/go/f* /usr/lib/go-1.13/api /usr/lib/go/api /usr/lib/finalrd/finalrd-static.conf /usr/share/go/api /usr/share/go/f* /usr/share/fwupd/add_capsule_header.py /usr/share/gdb/auto-load /usr/share/go-1.13/api /usr/share/go/api /usr/share/fwupd/firmware_packager.py /usr/share/ghostscript/fonts /usr/share/hal/fdi
チルダ展開

チルダ(~)はユーザ名を指定するメタ文字です。~のみで、自分自身のホームディレクトリ($HOME)として展開されます。~ユーザ名で、特定ユーザ名のホームディレクトリとして展開されます。

$ echo ~
/home/user
$ echo ~root
/root

特殊な使い方として、~+~-があります。``+はカレントディレクトリ($PWD)と同義です。~-`は、カレントディレクトリの前にいたディレクトリ($OLDPWD) として扱われます。

$ pwd
/home/user/tmp
$ cd /home/user/bin
$ echo ~+
/home/user/bin
$ echo ~-
/home/user/tmp

~"などでクォートされていた場合、チルダ展開が行われません。

終わりに

今回はbashの展開機能の、ブレース展開とチルダ展開について説明しました。次回は、パラメータと変数の展開、算術式展開について説明します。次回をお楽しみに。

 


 

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