例えば、変数「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 ■■■■