パソコン悪戦苦闘記録

【Linux】パラメータ展開で変数の値を操作

 Linux シェルスクリプトで、変数に値(文字列など)を代入するには、「=」を使います(今さらですが)。
 例えば、変数「n」に「goosyun」という値(文字列)を代入するときは、
  n=goosyun です。

 変数に代入された値を参照するには、「$」を使います(これも、今さらですが)。
 変数名の前に$を付けて、例えば、echo $n とします。これを実行すると、変数nに代入された値goosyunがディスプレイに出力(表示)されます。
 変数名の前後を{}で囲って、変数の区切りを明示することもできます。
 echo ${n} という書き方です(変数と文字列を連結するには{}が必須です。)。

 上記のように、変数名を格納された値(代入された文字列)に置き換えることを、「パラメータ展開」と呼ぶそうです。私には、展開(*1)という用語は、いまだにしっくりこないところはありますが。
(*1)「展開」とは、メタ文字と呼ばれる * ? [] などの特別の記号を、他の文字列に置き換える機能のことです。






 パラメータ展開に当たっては、{}の中に、変数名のほかに特殊な記号も入れることで、変数の値を操作することができます。

 bashなどのシェルには、変数の値を、いろいろと操作する方法が用意されています。
 その中の一つに、
 「変数の値から、パターンにマッチした部分を取り除いた値に展開する
というものがあります。

【1】 ${変数名#パターン}
【2】 ${変数名%パターン}
という書き方です。

 【1】の「#」は、前方一致削除です。
  パターンに前方一致した部分を取り除いて、残りの部分に展開されます。
 【2】の「%」は、後方一致削除です。
  パターンに後方一致した部分を取り除いて、残りの部分に展開されます。

 さらに、「#」の代わりに「##」と、また「%」の代わりに「%%」とすると、最長一致削除となります。

 例を挙げます。
 f=/home/goosyun/mytxt/hoge.txt として変数「f」にパス(ディレクトリ名とファイル名)を代入しておきます。
 その上で、
 echo ${f##*/} とすると、hoge.txt が出力されます。
 echo ${f%/*} とすると、/home/goosyun/mytxt が出力されます。

 このように、パスの文字列の中から、ファイル名やディレクト名だけを抜き出すことができます。
 パスからファイル名を取り出すには別に「basename」コマンドが、またパスからディレクトリ名を取り出すには別に「dirname」コマンドが、それぞれあります。

 けど、上記のように、「#」や「%」を使ったパラメータ展開でも、「basename」や「dirname」と同じことができます。

 先日、複数のテキストファイルの文字コードを変換するシェルスクリプトを記事にしました。
 こちらの記事をご覧ください。

 その先日の記事においては、「basename」コマンドを使ってスクリプトを書いていますが、%を使ったパラメータ展開でも同じことができるというわけです。

 パラメータ展開を使う方式では、次のようなスクリプトになります。

#!/bin/bash
for file in ~/hoge/*.txt
do
  iconv -f SHIFT_JIS -t UTF-8 ${file} > ~/afterconv/${file##*/}
done 





それでは、また次の記事で
goosyun
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「Ubuntu」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事