% 在 Linux shell 字符串中起什么作用?

% 在 Linux shell 字符串中起什么作用?

在 Linux shell 中,% 的作用是什么,例如:

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

答案1

%在模式中使用时${variable%substring},它将返回从后面删除的variable最短出现次数的内容。substringvariable

此函数支持通配符模式 - 这就是它接受星号作为零个或多个字符的替代的原因。

值得一提的是,这是 Bash 特有的 - 其他 Linux shell 不一定包含此功能。

如果你想了解更多关于 Bash 中的字符串操作,我强烈建议你阅读页面。除其他方便的功能外,它还解释了它的作用%%:)

编辑:我忘了提到,当它在模式$((variable%number))$((variable1%$variable2))字符中使用时%,它将充当模数运算符。DavidPostill 在他的回答中有更具体的文档链接。

%在不同上下文中使用时,它应该仅被识别为常规字符。

答案2

Bash 参考手册:Shell 参数扩展

${parameter%word}
${parameter%%word}

单词被扩展以产生一个模式,就像文件名扩展一样。如果模式与扩展值的尾部部分匹配范围,则扩展的结果为范围删除最短匹配模式(案例‘%’)或最长匹配模式(‘%%’案例)。如果范围或将模式移除操作依次应用于每个位置参数,扩展为结果列表。‘@’如果‘*’,范围是一个以 为下标的数组变量,‘@’ 或者‘*’,将模式删除操作依次应用于数组的每个成员,扩展为结果列表。

答案3

通过实验,我发现当字符串被花括号(大括号)括起来时,% 后面的匹配会被丢弃。

为了显示:

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*

答案4

在 Linux shell ( bash) 中,它%做什么?

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

在这个特殊情况下%模式匹配运算符(注意,它也可以是一个模数操作员)。


模式匹配运算符

${var%$模式},${var%%$模式}

${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

来源参数替换


模运算符

%

模数或 mod(返回整数除法运算的余数)

bash$ expr 5 % 3
2

5/3 = 1,余数为 2

来源运算符

相关内容