-1

我正在查看一些 shell 脚本,我发现了类似的东西

${var#*.}

如果 $var 是 111.txt 那么

echo ${var#*.} 

将返回txt,这很好,我想知道为什么,谢谢

4

3 回答 3

0

${var#pattern}将找到变量值的模式(从开头开始,最短)并将其删除,然后返回其余部分。
所以,你的模式意味着“任何后面跟着一个。”,然后你留下一个“txt”。
顺便说一句,${var##pattern}会删除最长匹配的模式
if var=111.111.txt,然后
${var#\*.}会 return111.txt
${var##\*.}会返回txt

于 2013-06-01T14:00:25.913 回答
0

bash手册页

${parameter#word}

删除匹配的前缀模式。
单词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数值的开头,则扩展的结果是删除了最短匹配模式的参数扩展值。

于 2013-06-01T14:01:04.440 回答
0

原因是因为使用模式操纵部分字符串的能力非常有用,因为它避免了昂贵的叉子和管道以及

${#parameter}

字符串长度。应替换参数值的字符长度。如果参数是 '*' 或 '@',扩展的结果是未指定的。如果未设置参数并且设置 -u 有效,则扩展将失败。

以下四种参数扩展提供了子字符串处理。在每种情况下,应使用模式匹配表示法(参见模式匹配表示法)而不是正则表达式表示法来评估模式。如果参数是“#”、“*”或“@”,则扩展的结果是未指定的。如果未设置参数并且设置 -u 有效,则扩展将失败。将完整的参数扩展字符串括在双引号中不应导致以下四种模式字符被引用,而大括号内的引号字符应具有此效果。在每个品种中,如果省略单词,则应使用空模式。

${parameter%[word]}

删除最小后缀模式。这个词应该被扩展以产生一个模式。然后参数扩展将产生参数,其中后缀的最小部分与模式匹配删除。如果存在,单词不应以未加引号的 '%' 开头。

${parameter%%[word]}

删除最大后缀模式。这个词应该被扩展以产生一个模式。然后参数扩展将产生参数,其中与模式匹配的后缀的最大部分被删除。

${parameter#[word]}

删除最小前缀模式。这个词应该被扩展以产生一个模式。然后参数扩展将产生参数,其中前缀的最小部分与模式匹配被删除。如果存在,单词不应以未加引号的“#”开头。

${parameter##[word]}

删除最大前缀模式。这个词应该被扩展以产生一个模式。然后参数扩展将产生参数,其中与模式匹配的前缀的最大部分被删除。

于 2013-06-01T14:04:58.283 回答