bashの%パラメータ展開方法
bashの%と%%のパラメータ展開方法を調べる。
manには以下のようにある。
${parameter%word}
${parameter%%word}
word が展開され、パス名展開の場合と同じようなパターンを作ります。このパタ
ーンが parameter を展開した値の末尾の部分とマッチする場合、展 開 結 果 は
parameter を展開した値から最短一致パターン (‘‘%’’ の場合) または最長一
パターン (‘‘%%’’ の場合) を取り除いたものになります。 parameter が @ ま
は * である場合、パターンを削除する操作は全ての位置パラメータに順番に適用
され、展開結果はリストとして得られます。 parameter が @ または * が添字に
な っている配列変数である場合、パターンを削除する操作は配列の全ての要素に
順番に適用され、展開結果はリストとして得られます。
この記述だと、何をいっているのかよくわからないので簡単なシェルスクリプトを書いて試してみた。${parameter%%word}
word が展開され、パス名展開の場合と同じようなパターンを作ります。このパタ
ーンが parameter を展開した値の末尾の部分とマッチする場合、展 開 結 果 は
parameter を展開した値から最短一致パターン (‘‘%’’ の場合) または最長一
パターン (‘‘%%’’ の場合) を取り除いたものになります。 parameter が @ ま
は * である場合、パターンを削除する操作は全ての位置パラメータに順番に適用
され、展開結果はリストとして得られます。 parameter が @ または * が添字に
な っている配列変数である場合、パターンを削除する操作は配列の全ての要素に
順番に適用され、展開結果はリストとして得られます。
#!/bin/sh
dest="$1"
echo $dest
dest="${dest%/}" #末尾/を削除
echo $dest
dest="${dest%/*}" #末尾の/*を削除(最小一致)
echo $dest
dest="${dest%%/*}" #末尾の/*を削除(最大一致)
echo $dest
これを実行すると以下のようになる。dest="$1"
echo $dest
dest="${dest%/}" #末尾/を削除
echo $dest
dest="${dest%/*}" #末尾の/*を削除(最小一致)
echo $dest
dest="${dest%%/*}" #末尾の/*を削除(最大一致)
echo $dest
$ ./test.sh /aaa/bbb/ccc/
/aaa/bbb/ccc/
/aaa/bbb/ccc
/aaa/bbb
$ ./test.sh aaa/bbb/ccc/
aaa/bbb/ccc/
aaa/bbb/ccc
aaa/bbb
aaa
@や*は試していないが、なんとなく使い方はわかった。
/aaa/bbb/ccc/
/aaa/bbb/ccc
/aaa/bbb
$ ./test.sh aaa/bbb/ccc/
aaa/bbb/ccc/
aaa/bbb/ccc
aaa/bbb
aaa
0 件のコメント:
コメントを投稿