次のbashスクリプトを考えてみましょう。
#!/bin/bash
echo "${1##*.}"
ファイル名が最初のコマンドライン引数として指定された場合、このスクリプトはファイル拡張子を次のように出力します。
$ ./script.sh ./file.pdf
上記の場合にpdf
印刷されます。
${1##*.}
この式がファイル拡張子を抽出する方法を説明してください。
(私は$ 0、$ 1、$ 2、$#がbashで何をするのか理解し、正規表現もある程度理解しています)
答え1
Bashパラメーター拡張は、変数を拡張するときの値に対するさまざまな変更をサポートします。その一つは##
、値の最長の接頭辞を削除します。パターンマッチ(モードはいいえ正規表現はここから)。
この場合のパターンはです*.
。後ろにゼロ個以上の文字がある場合は、.
最後の${x##*.}
文字まですべての文字列を削除.
し、その点以降のすべての文字を保持するという意味です。
${1##*.}
は通常、を使用してアクセスする最初の位置パラメータの値に拡張することを意味します$1
。最終結果は
echo "${1##*.}"
.
次に、ファイル拡張子である最後のパラメータの後にスクリプトの最初のパラメータ部分を印刷します。
パターンならいいえ正確な一致の場合、変数の合計値は未使用のように拡張されます##
。この場合、指定した引数が.
まったく存在しない場合は再度取得します。
Bashはまた、最短の一致プレフィックスを削除するための単一の使用をサポートし#
、%
文字列の終わりを一致させるために同じ方法を使用することもサポートします。
答え2
簡単な例:
$ A=my.file.name.txt
$ echo ${A}
my.file.name.txt
$ echo ${A#m}
y.file.name.txt
$ echo ${A#my}
.file.name.txt
$ echo ${A#*.}
file.name.txt
$ echo ${A##*.}
txt
スクリプトでは、$ {1}は最初のパラメータであり、同じ概念が適用されます。
答え3
注 Bash パラメータ拡張:
#演算子を使用して、頭部から文字列を切り取ることができます。
% 演算子を使用して、尾の部分から文字列を切り取ることができます。
たとえば、見てみましょう。
[my->prompt]$ VAR="head:string:tail"
[my->prompt]$ echo ${VAR##*:} //trim from the head -> till the last ':'
tail
[my->prompt]$ echo ${VAR#*:} //trim from the head -> till the first ':'
string:tail
[my->prompt]$ echo ${VAR%%:*} //trim from the tail <- till the last ':'
head
[my->prompt]$ echo ${VAR%:*} //trim from the tail <- till the first ':'
head:string
[my->prompt]$ VAR2=${VAR%:*} //VAR2="head:string"
[my->prompt]$ echo $VAR2
head:string
[my->prompt]$ echo ${VAR2#*:} //trim from the head -> till the first ':'
string