Linuxシェルでは、次のように%は何をしますか。
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
_%
_をパターン_${variable%substring}
_で使用すると、variable
のコンテンツがsubstring
の後ろから削除され、variable
が最短で削除されます。
この関数はワイルドカードパターンをサポートしています。そのため、0個以上の文字の代わりにスター(アスタリスク)を受け入れます。
これはBash固有であることに注意してください。他のLinuxシェルには、この関数が必ずしも含まれていません。
Bashでの文字列操作について詳しく知りたい場合は、 this ページを読むことを強くお勧めします。他の便利な関数の中で、たとえば、_%%
_が何をするかを説明します:)
編集:パターン$((variable%number))
または$((variable1%$variable2))
で使用される場合、_%
_文字はモジュロ演算子として機能することを忘れていました。 DavidPostillの回答には、より具体的なドキュメントリンクがあります。
_%
_が異なるコンテキストで使用されている場合、通常の文字としてのみ認識される必要があります。
${parameter%Word}
${parameter%%Word}
Wordが展開されて、ファイル名の展開と同じようにパターンが生成されます。パターンがparameterの拡張された値の末尾部分と一致する場合、拡張の結果はparameter最短一致パターン(
‘%’
ケース)または最長一致パターン(‘%%’
ケース)が削除されています。 parameterが‘@’
または‘*’,
の場合、パターン削除操作が各位置パラメーターに順番に適用され、展開は結果のリスト。 parameterが‘@’
または‘*’,
で添字された配列変数である場合、パターンの削除操作は配列の各メンバーに適用されますターン、そして展開が結果のリストです。
実験により、文字列が中かっこ(中かっこ)で囲まれている場合、%の後の一致が破棄されることがわかりました。
説明する:
touch abcd # Create file abcd
for file in ab*; do
echo $file # echoes the filename
echo $file% # echoes the filename plus "%"
echo ${file%} # echoes the filename
echo "${file%}" # echoes the filename
echo
echo "${file%c*}" # Discard anything after % matching c*
echo "${file%*}" # * is not greedy
echo ${file%c*} # Without quotes works too
echo "${file%c}" # No match after %, no effect
echo $file%c* # Without {} fails
done
出力は次のとおりです。
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*
bash
)では、%
は何をしますか?for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
この特定のケースでは、%
は パターンマッチング 演算子です( modulo 演算子でもかまいません)。
$ {var%$ Pattern}、$ {var %% $ Pattern}
${var%$Pattern}
$var
から、$Pattern
のバックエンドに一致する$var
の最短部分を削除します。
${var%%$Pattern}
$var
から、$Pattern
のバックエンドに一致する$var
の最も長い部分を削除します。例:パラメータ置換でのパターンマッチング
#!/bin/bash # patt-matching.sh # Pattern matching using the # ## % %% parameter substitution operators. var1=abcd12345abc6789 pattern1=a*c # * (wild card) matches everything between a - c. echo echo "var1 = $var1" # abcd12345abc6789 echo "var1 = ${var1}" # abcd12345abc6789 # (alternate form) echo "Number of characters in ${var1} = ${#var1}" echo echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c') echo "--------------" echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789 # Shortest possible match, strips out first 3 characters abcd12345abc6789 # ^^^^^ |-| echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789 # Longest possible match, strips out first 12 characters abcd12345abc6789 # ^^^^^ |----------| echo; echo; echo pattern2=b*9 # everything between 'b' and '9' echo "var1 = $var1" # Still abcd12345abc6789 echo echo "pattern2 = $pattern2" echo "--------------" echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a # Shortest possible match, strips out last 6 characters abcd12345abc6789 # ^^^^ |----| echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a # Longest possible match, strips out last 12 characters abcd12345abc6789 # ^^^^ |-------------| # Remember, # and ## work from the left end (beginning) of string, # % and %% work from the right end. echo exit 0
ソース パラメータ置換
%
modulo、またはmod(整数除算演算の剰余を返します)
bash$ expr 5 % 3 2
5/3 = 1、残り2
ソース 演算子