Bash字符串处理(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)...

本文详细介绍了Bash和Java在字符串处理方面的差异,包括判断字符串是否包含其他字符串的多种方法,如contains、indexOf、matches等,并通过实例演示了在Bash中实现这些功能的技巧。

Bash字符串处理(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)

In Java

String.contains & String.indexOf

String.contains方法只能判断是否包含某个子串,不能判断是否包含单个字符(当然能判断是否包含单个字符的子串)

boolean     contains(CharSequence s)
          当且仅当此字符串包含 char 值的指定序列时,才返回 true。

 

使用String.indexOf方法判断是否包含某个字符

int     indexOf(int ch)
          Returns the index within this string of the first occurrence of the specified character.

 

if (s.contains(c)) {

}

 

使用String.indexOf方法判断是否包含某个子串

int     indexOf(String str)
          Returns the index within this string of the first occurrence of the specified substring.

 

if (str.indexOf(sub) >= 0) {

    // do something

}

 

使用String.matches方法判断是否包含子串,注意正则表达式元字符的转义

boolean     matches(String regex)
          Tells whether or not this string matches the given regular expression.

 

if (str.matches(".*"+sub+".*")) {

    // do something

}

 

StringUtils.contains

判断是否包含某个字符

org.apache.commons.lang.StringUtils contains方法 写道
public static boolean contains(String str, char searchChar)

Checks if String contains a search character, handling null. This method uses String.indexOf(int).

A null or empty ("") String will return false.

StringUtils.contains(null, *) = false
StringUtils.contains("", *) = false
StringUtils.contains("abc", 'a') = true
StringUtils.contains("abc", 'z') = false

Parameters:
str - the String to check, may be null
searchChar - the character to find
Returns:
true if the String contains the search character, false if not or null string input

 

判断是否包含另外的子串

org.apache.commons.lang.StringUtils contains方法 写道
public static boolean contains(String str, String searchStr)

Checks if String contains a search String, handling null. This method uses String.indexOf(String).

A null String will return false.

StringUtils.contains(null, *) = false
StringUtils.contains(*, null) = false
StringUtils.contains("", "") = true
StringUtils.contains("abc", "") = true
StringUtils.contains("abc", "a") = true
StringUtils.contains("abc", "z") = false


Parameters:
str - the String to check, may be null
searchStr - the String to find, may be null
Returns:
true if the String contains the search String, false if not or null string input
 

In Bash

是否包含子串(推荐方式)

[[ $STR == *$SUB* ]]

[[ $STR == *$SUB* ]]

注意:*不能引起来,否则不灵。

 

[root@jfht ~]# STR=123456789
[root@jfht ~]# SUB=456
[root@jfht ~]# [[ "$STR" == *"$SUB"* ]] && echo contains;
contains
[root@jfht ~]# SUB=4568
[root@jfht ~]# [[ "$STR" == *"$SUB"* ]] && echo contains;
[root@jfht ~]# SUB="1 2"
[root@jfht ~]# [[ "$STR" == *"$SUB"* ]] && echo contains;
[root@jfht ~]# [[ "$STR" == *$SUB* ]] && echo contains; 
[root@jfht ~]# STR="1 2 3"
[root@jfht ~]# [[ "$STR" == *$SUB* ]] && echo contains;
contains
[root@jfht ~]#

 

特殊情况:以某子串开头。

[[ $STR == $SUB* ]]

特殊情况:以某子串结尾。

[[ $STR == *$SUB ]]

 

[root@jfht ~]# STR=123456789
[root@jfht ~]# SUB=123
[root@jfht ~]# [[ "$STR" == $SUB* ]] && echo "starts"; 
starts
[root@jfht ~]# [[ "$STR" == *$SUB ]] && echo "ends";
[root@jfht ~]# SUB=789
[root@jfht ~]# [[ "$STR" == $SUB* ]] && echo "starts";
[root@jfht ~]# [[ "$STR" == *$SUB ]] && echo "ends";
ends

 

使用正则表达式匹配方式确定是否包含子串

[[ $STR =~ .*$SUB.* ]]

注:.*是不必要的,可写成

[[ $STR =~ $SUB ]]

 

[root@jfht ctmw]# STR=123456789
[root@jfht ctmw]# SUB=456
[root@jfht ctmw]# [[ "$STR" =~ .*$SUB.* ]] && echo contains
contains
[root@jfht ctmw]# [[ "$STR" =~ $SUB ]] && echo contains
contains

 

使用case语句来确定是否包含子串

case "$STR" in *$SUB*) echo contains; ;; esac

 

[root@jfht ctmw]# STR=123456789
[root@jfht ctmw]# SUB=456
[root@jfht ctmw]# case "$STR" in *$SUB*) echo contains; ;; esac
contains
[root@jfht ctmw]#

 

使用字符串替换来实现是否包含子串

if [ "$STR" != "${STR/$SUB/}" ]; then echo contains; fi

解读:如果将字符串STR中的SUB子串删除掉之后,不与STR相等,就表明STR中包含SUB串。

 

[root@jfht ctmw]# STR=123456789
[root@jfht ctmw]# SUB=456
[root@jfht ctmw]# if [ "$STR" != "${STR/$SUB/}" ]; then echo contains; fi
contains
[root@jfht ctmw]#

 

使用grep来实现是否包含子串

if echo "$STR" | grep -q "$SUB"; then echo contains; fi

if grep -q "$SUB" <<<"$STR"; then echo contains; fi

 

[root@jfht ctmw]# STR=123456789
[root@jfht ctmw]# SUB=456
[root@jfht ctmw]# if echo "$STR" | grep -q "$SUB"; then echo contains; fi
contains
[root@jfht ctmw]# if grep -q "$SUB" <<<"$STR"; then echo contains; fi
contains

[root@jfht ctmw]#

 

使用expr match来实现是否包含子串

if [ "$(expr match "$STR" ".*$SUB.*")" != "0" ]; then echo contains; fi

 

[root@jfht ctmw]# STR=123456789
[root@jfht ctmw]# SUB=456
[root@jfht ctmw]# if [ "$(expr match "$STR" ".*$SUB.*")" != "0" ]; then echo contains; fi
contains
[root@jfht ctmw]#

 

 

本文链接:http://codingstandards.iteye.com/blog/1181490   (转载请注明出处)

返回目录:Java程序员的Bash实用指南系列之字符串处理(目录) 

上节内容:Bash字符串处理(与Java对照) - 13.字符串数组连接(以指定分隔符合并)

下节内容:Bash字符串处理(与Java对照) - 15.计算子串出现的次数

 

 

<think>嗯,用户这次想深入了解安卓系统属性"ro.separate.soft"的具体含义。结合用户提供的adb命令引用,这应该是个安卓开发者或系统维护人员。 用户引用的资料里提到"adb shell getprop ro.separate.soft"能查看手机项目代号,但这解释太简略了。需要更完整地说明这个属性的背景:它是厂商自定义的只读属性,命名规则遵循安卓惯例(ro前缀表示只读),通常被手机厂商用来标识软件分支版本或定制版本号。 考虑到用户专门查询这个特定属性,可能有实际排查场景。应该提醒属性值差异对比的重要性——例如当同一机型在不同地区销售时,这个属性可能显示"CN"(中国版)/"GL"(全球版)等后缀。用户如果正在处理OTA升级失败或多区域设备兼容性问题,这个提示会很有用。 要不要补充查询技巧呢?用户上次引用里提到grep过滤,可以强化这个实用技巧:建议配合"getprop | grep separate"来模糊查询,毕竟系统属性多达上百个。不过用户看起来已经掌握基础命令,重点还是解释属性含义。 最后得明确说明局限性:这个属性完全由厂商定义,不同品牌用法可能不同。举华为/荣耀分离的例子很合适——这正是"separate.soft"的字面案例。结尾保持开放性,用户若需要深度分析可以进一步提供属性值样本。 </think>`ro.separate.soft` 是 Android 系统中的一个 **只读属性 (ro property)**,主要用于标识设备的 **软件分支或定制版本信息**。以下是详细说明: ### 1. **属性类型功能** - **只读属性 (`ro`前缀)**:在系统启动时由 `init` 进程或厂商脚本定义,**用户或普通应用无法修改**。 - **核心作用**:记录设备的软件定制版本或项目分支代码(如区域版本、运营商定制版等)。 - **典型值示例**: - `CN`(中国版) - `EU`(欧洲版) - `GL`(全球版) - `KR`(韩国版) - 厂商自定义字符串(如 `ABC_Project_V2`) ### 2. **查询方法** 通过 **ADB 命令**直接读取: ```bash adb shell getprop ro.separate.soft ``` 若需模糊匹配(如不确定完整属性名): ```bash adb shell getprop | grep separate ``` ### 3. **典型应用场景** - **区分设备区域版本** 例如:同一机型在中国版设备返回 `CN`,国际版返回 `GL`。 - **OTA 升级控制** 系统更新服务器根据此属性推送适配的固件包 [^2]。 - **厂商内部软件管理** 用于追踪不同分支的软件版本(如测试版/稳定版/运营商定制版)。 - **故障排查依据** 客服通过该值快速定位设备所属软件分支(如反馈特定区域版本的 Bug)。 ### 4. **其他属性的关联** | 属性名 | 说明 | `ro.separate.soft` 的关系 | |-----------------------|-----------------------|--------------------------------------| | `ro.product.name` | 设备机型代号 | 共同定义设备软硬件标识 | | `ro.boot.regionmark` | 启动分区中的区域标志 | 可能作为 `ro.separate.soft` 的输入源 | | `ro.build.flavor` | 系统构建类型 | 互补描述软件版本特性 | ### 5. **重要注意事项** - **厂商自定义特性** 该属性**非 Android 标准属性**,名称和含义完全由设备制造商决定。 - **可能不存在** 部分厂商使用其他属性(如 `ro.build.region`)实现相同功能。 - **值格式无统一规范** 字符串内容和长度因厂商而异(需参考具体设备文档)。 ### 示例分析(华为/荣耀设备) ```bash # 查询结果可能为: ro.separate.soft: hw_CN ``` 表明这是一个**华为中国版软件分支**的设备,可能预装国内服务(如华为应用市场、天际通等),系统更新会优先检测国内服务器 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值