当前位置: 首页 > 面试题库 >

Shell参数名称后带有井号和百分号的语法

穆飞星
2023-03-14
问题内容

请解释以下语法:

  i##*.

  i%.*

我了解它在做什么,但是我想知道一般模式(为什么/如何做)。

出现的代码:

#!/bin/bash

recursive_name_change()
{
    cd "$1"
    for i in *
    do
        #echo "${i##*.}"
        if [ -d "$i" ]
        then
            recursive_name_change "$i"
        elif [ "${i##*.}" = "cpp" ]
        then
             new_name=${i%.*}".c"
        mv "$i" "$new_name"
        fi
        done
        cd ../
    }

recursive_name_change .

也有人建议,我从哪里可以找到这些特殊的语法形式?


问题答案:

参见 参数扩展man bash

   ${parameter#word}
   ${parameter##word}

删除匹配的前缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#情况)或最长匹配模式(##情况)的参数的扩展值。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。

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

删除匹配的后缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式(%%情况)删除。如果parameter为@或,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是用@或下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展名是结果列表。

简而言之,#从左侧删除图案,%从右侧删除图案,将符号加倍会使匹配的贪婪。(助记符:在大多数键盘上#位于左侧%)。



 类似资料:
  • 问题内容: 我已经检查了一些站点,它们的网址中带有井号(#)。它有什么作用? 问题答案: 这是“片段”或“命名锚点”。您可以用来链接到文档的 一部分 。通常,当您链接到页面时,浏览器会在页面顶部将其打开。但是,您链接到一半的部分,则可以使用该片段链接到该标题(或其他内容)。 如果页面内没有标签,则浏览器将仅链接到页面顶部。如果该片段为空,那么它也将仅链接到页面顶部。 仅 对于片段,这只是到 当前

  • 我正在开发一个API,它允许使用URL进行搜索,比如: 这个答案几乎是我想要做的,我只是找不到一种方法来定义括号内的值为“任何字符串”,而不是已知名称的列表。

  • 问题内容: 我刚刚注意到,我所有的路径中的井号(#!)后都有一个感叹号。我不确定如何以及为什么获得它们,因为今天早些时候我没有它们。 如果有什么办法可以摆脱它们,那么如果有人可以向我解释一下(以及我如何拥有它们),我将不胜感激。 因此,到目前为止,我发现的唯一解决方案是手动将感叹号放在应用程序中的每个href上,但这使我很烦,我也不知道该怎么办。 我用yeoman生成器生成了我的应用,而我的app

  • 我已经得到了一个抽象类位置的UML图。该类有一个变量字符串名称。它的方法是addEmployee(employee:employee):boolean。 Employee类与Location类相关联。Employee类必须包含变量String name和String address以及方法getName():String和getAddress():String 我不确定如何制作addEmploye

  • 问题内容: 我正在使用jq,但json标记中包含“-”使jq无法编译。我无法逃脱它使其工作。这里的命令 我已经在jq的github上阅读了这篇帖子https://github.com/stedolan/jq/issues/202,但我无法使其正常运行。 这是curl的输出 任何想法? 问题答案: 您需要用方括号和双引号引起来: 使用您给定的输入,它返回: 该JQ手册(开发) - >基本过滤器: 最