web-dev-qa-db-ja.com

Linux Shell文字列で%は何をしますか?

Linuxシェルでは、次のように%は何をしますか。

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done
28
Nissim Nanach

_%_をパターン_${variable%substring}_で使用すると、variableのコンテンツがsubstringの後ろから削除され、variableが最短で削除されます。

この関数はワイルドカードパターンをサポートしています。そのため、0個以上の文字の代わりにスター(アスタリスク)を受け入れます。

これはBash固有であることに注意してください。他のLinuxシェルには、この関数が必ずしも含まれていません。

Bashでの文字列操作について詳しく知りたい場合は、 this ページを読むことを強くお勧めします。他の便利な関数の中で、たとえば、_%%_が何をするかを説明します:)

編集:パターン$((variable%number))または$((variable1%$variable2))で使用される場合、_%_文字はモジュロ演算子として機能することを忘れていました。 DavidPostillの回答には、より具体的なドキュメントリンクがあります。

_%_が異なるコンテキストで使用されている場合、通常の文字としてのみ認識される必要があります。

30
Marek Rost

Bashリファレンスマニュアル:シェルパラメータの拡張

${parameter%Word}
${parameter%%Word}

Wordが展開されて、ファイル名の展開と同じようにパターンが生成されます。パターンがparameterの拡張された値の末尾部分と一致する場合、拡張の結果はparameter最短一致パターン(‘%’ケース)または最長一致パターン(‘%%’ケース)が削除されています。 parameter‘@’または‘*’,の場合、パターン削除操作が各位置パラメーターに順番に適用され、展開は結果のリスト。 parameter‘@’または‘*’,で添字された配列変数である場合、パターンの削除操作は配列の各メンバーに適用されますターン、そして展開が結果のリストです。

9
Steven

実験により、文字列が中かっこ(中かっこ)で囲まれている場合、%の後の一致が破棄されることがわかりました。

説明する:

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*
7
Nissim Nanach

Linuxシェル(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

ソース 演算子

7
DavidPostill