当前位置: 首页 > Linux

Bash小技巧:使用参数展开获取变量的子串和字符串长度

时间:2023-04-06 07:10:11 Linux

在bash中,常见的是使用${parameter}表达式来获取参数变量的值,这是参数展开的一种。Bash还提供了其他形式的参数扩展,可以对变量值做一些处理,起到操作字符串的作用。例如:${parameter:offset:length}从参数变量值的偏移字符开始,得到length字符,得到一个子串。${#parameter}获取参数变量值的字符串长度。注意:这些表达式都不会修改参数本身的变量值,它们只是根据参数的变量值展开得到一个新的值。如果要保存这些值,则需要将它们分配给特定的变量。有关说明,请参阅manbash的参数扩展部分。具体例子如下。${parameter:offset}和${parameter:offset:length}查看manbash对${parameter:offset}和${parameter:offset:length}的说明如下:子串扩展。从offset指定的字符开始,扩展到参数值的最多length个字符。如果参数是@、以@或*为下标的索引数组,或关联数组名称,则结果会有所不同,如下所述。如果省略length,则扩展为参数值的子字符串,从offset指定的字符开始,一直延伸到值的末尾。length和offset是算术表达式。如果offset的计算结果为小于零的数字,则该值将用作从参数值末尾开始的字符偏移量。如果length的计算结果为小于零的数字,则它被解释为从参数值末尾开始的字符偏移量而不是字符数,并且扩展是偏移量和该结果之间的字符。笔记负偏移量必须与冒号分隔至少一个空格,以避免与:-扩展混淆。即${parameter:offset:length}表达式从参数变量值的偏移字符开始,得到length个字符,得到一个子串,其中会包含第offset个字符本身。${parameter:offset}表达式省略了长度参数,将从参数变量值的第offset个字符开始到最后。这里的长度和偏移量可以是算术表达式。字符串偏移量从0开始,如果offset的值小于0,则将该值作为参数变量值的结束偏移量,从后向前取字符。如果长度值小于0,则视为参数变量值的结束偏移量,而不是字符总数,扩展后的结果是这两个偏移量之间的字符。注意:负偏移量必须至少由一个空格和一个冒号分隔,以避免与:-扩展混淆。也就是说,冒号:和减号之间必须至少有一个空格-在这种情况下,类似于:-形式。具体示例如下:$value="Thisisateststring."$echo${value:5}isateststring.$echo${value:5:2}is$echo${value:5:-4}是测试str$echo${value:-7:3}str$echo${value:-7:-1}string可以看到${value:5}从value变量中获取了第五个字符value从开始到结束的所有字符。注意偏移量从0开始,得到的子串包括第5个字符本身。${value:5:2}从value变量value的第5个字符开始,得到包括该字符在内的两个字符,即“is”字符串。当给定的长度参数值为负数时,减号和冒号之间要用空格隔开。此时的length参数并不是表示要获取的字符个数,而是表示对应参数变量的值从后到前的偏移量,这个偏移量是从1开始的。${value:5:-4}表示从值变量value的第5个字符开始,到倒数第4个字符,不包括倒数第4个字符。当offset参数值为负数时,减号和冒号必须用空格分隔。此时offset参数对应的是参数变量的值从后往前的偏移量,这个偏移量是从1开始的。${value:-7:3}表示从最后7个字符串开始value变量值,得到包括这个字符在内的三个字符,也就是“str”字符串。${value:-7:-1}表示从value变量的倒数第7个字符串开始,到倒数第1个字符。包括倒数第7个字符,排除倒数第1个字符。具体就是得到“string”字符串,不包括最后的点..${#parameter}参见manbash对${#parameter}的说明如下:Parameterlength。替换参数值的字符长度。如果参数是*或@,则替换的值是位置参数的数量。如果参数是下标为*或@的数组名称,则替换的值是数组中元素的数量。即如果参数变量值是字符串,${#parameter}可以得到对应字符串的长度。具体例子如下:$value="123456"$echo${#value}6注意:在bash的参数扩展中,数字属于位置参数,数字可以用来指代传递给脚本或函数的参数。在当前表达式中使用时,表示获取传入参数的字符串长度。比如$1对应传入的第一个参数,那么${#1}对应传入的第一个参数的字符串长度。具体例子如下:$functionparam_length(){echo${#1};}$param_length1234566如您所见,param_length函数使用${#1}来获取给定的第一个参数值的长度。