当前位置: 首页 > Linux

BashTips-详细讲解使用case复合命令匹配特定模式进行处理

时间:2023-04-06 07:18:48 Linux

在Linux的Bashshell中,case复合命令(compoundcommands)可以在匹配特定模式时执行相应的命令。查看manbash里面对case命令的说明如下:casewordin[[(]pattern[|pattern]...)list;;]...esac一个case命令首先扩展单词,并依次尝试将其与每个模式匹配。使用波浪号扩展、参数和变量扩展、算术替换、命令替换、过程替换和引号删除来扩展单词。检查的每个模式都使用波浪号扩展、参数和变量扩展、算术替换、命令替换和进程替换进行扩展。当找到匹配项时,将执行相应的列表。如果;;使用运算符时,在第一个模式匹配后不会尝试后续匹配。使用;&代替;;使执行继续与下一组模式关联的列表。使用;;&代替;;使shell测试语句中的下一个模式列表(如果有),并在成功匹配时执行任何关联列表。退出状态为零如果没有模式匹配。否则,它是列表中最后执行的命令的退出状态。注意:关键字case是bash的内置命令,该命令要求最后一个参数必须是esac。esac关键字本身并不是bash的内置命令,它只是case命令必须提供的一个参数下面用一个testcase.sh脚本来说明case命令的详细用法。脚本内容如下:#!/bin/bashvar=4case$1in1)echo"Yourinputis1.";;2|3|4)echo"你的输入是2,或3,或4。";;&$var)echo"当然,你的输入是4。";;狮子)回声“你的输入是狮子。”;;“大狮子”)回声“你的输入是大狮子。”;&"fallthroughfrombiglion")echo"这是从大狮子身上掉下来的。";;*)echo"不支持您的输入。";;esac执行这个脚本的结果如下:$./testcase.sh1你输入的是1.$./testcase.sh2你输入的是2,或者3,或者4。不支持你的输入。$./testcase。sh4Yourinputis2,or3,or4.Sure,youinputis4.$./testcase.shlion你的输入是lion.$./testcase.sh"biglion"你的输入是biglion.这是fallthrough来自biglion.$./testcase.shtiger不支持您的输入。执行结果和脚本的重点解释如下:case命令后面的参数是要匹配的模式,这里使用$1获取脚本执行时传入的第一个参数。in参数后跟可以处理的模式列表,每个模式都以)结尾。您可以使用表格2|3|4)匹配多个模式,每个模式用|分隔。如果写成1)|2)|3)、会报错。也就是说,只有最后一个模式以)结尾。pattern列表不限于数字,可以是不带引号的字符串、带引号的字符串、bash扩展语句、通配符等。比如上面用$var来匹配var变量的值。如果要匹配的字符串有空格,必须用引号括起来,否则会报错。可以使用*通配符匹配任意内容,类似于默认的分支语句,这条语句一定要写在最后,否则会先匹配,影响后面语句的匹配。每个模式处理后,一定要以;;、;&或;;&结尾。如果这三个都没有提供,就会报错。;;表示不再匹配,将结束整个case命令的执行。效果类似于在select中执行break命令。;&表示继续执行下一个模式中的语句,而不检查下一个模式是否匹配。上面的“biglion”)模式在最后使用了;&,从执行结果可以看出,会执行“fallthroughfrombiglion”)模式的语句。;;&表示继续匹配,如果找到匹配的模式,则执行模式中的语句。以上2|3|4)pattern在最后使用;;&,当匹配到2时,继续匹配,中间一直找不到匹配,直到匹配到*),执行*)pattern中的语句。匹配到4时,$var)模式向下匹配,然后;;在$var)模式中用于结束执行,并且没有进一步的匹配。在实际应用中,可以将case命令与getopts命令结合使用。getopts命令获取执行脚本时传入的选项参数,case命令根据不同的选项参数进行不同的处理。一个简单的例子如下:whilegetopts"bf"arg;在b)handle_option_b中执行case${arg};;f)handle_option_f;;?)显示帮助;;用户选择的项目,case命令根据用户选择的不同项目进行不同的处理。这里不再举例。