在 Linux shell 中,% 的作用是什么,例如:
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
答案1
当%
在模式中使用时${variable%substring}
,它将返回从后面删除的variable
最短出现次数的内容。substring
variable
此函数支持通配符模式 - 这就是它接受星号作为零个或多个字符的替代的原因。
值得一提的是,这是 Bash 特有的 - 其他 Linux shell 不一定包含此功能。
如果你想了解更多关于 Bash 中的字符串操作,我强烈建议你阅读这页面。除其他方便的功能外,它还解释了它的作用%%
:)
编辑:我忘了提到,当它在模式$((variable%number))
或$((variable1%$variable2))
字符中使用时%
,它将充当模数运算符。DavidPostill 在他的回答中有更具体的文档链接。
当%
在不同上下文中使用时,它应该仅被识别为常规字符。
答案2
${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
来源运算符