比较 Busybox ash 中的子字符串

Posted

技术标签:

【中文标题】比较 Busybox ash 中的子字符串【英文标题】:compare substrings in Busybox ash 【发布时间】:2017-01-02 22:19:00 【问题描述】:

这是我第一次使用 ***。我目前面临一个问题,并在此处分享详细信息。

我目前正在构建一个 POS 自动化脚本。 POS 终端有 Shell Busybox ash 。这就是为什么我不能使用基本命令,因为它们的行为不一样。 以下是查询:

假设 [[ $I == $N$A ]] - 此比较用于精确匹配,其中 $I 是较大的字符串,$N$A 包含 $I 的子字符串。 我已经使用 [ -z $I##$N$A* ] 和 [ “$I” == “$N$A”* ] 语法来比较子字符串,但它失败并且表现不应该。

如果有人对此有任何建议,请指导。 请让我知道是否有任何用于busybox ash 的在线控制台,我可以在其中测试一些脚本。

已添加示例 -27-08-16

假设 - 派生值$I = "Credit.saleApproved" 的脚本 我正在传递 $N= "Credit" and $A= ".sale" 的值 所以基本上 echo $N$A 是 echo $Isubstring 我写这个伪逻辑是为了让你更好地理解

If  [[ $I == $N$A ]]  
then  
echo "sale is complete"  
else  
echo "sale is declined"  
fi   

我只需要 -->

1 . input : $I = Credit.saleApproved  
          $N$A = Credit.sale  
    Output :sale is complete  

2.input : $I = Credit.sApproved  
          $N$A = Credit.sale  
    Output :sale is Declined  

【问题讨论】:

您是要进行完全匹配、以开头匹配还是在灰中包含匹配? 是的。我正在寻找一个精确的子字符串匹配。 通配符在 ash shell case-switch 中工作 unix.stackexchange.com/a/370893/38213 我已经在 busybox 中运行过 【参考方案1】:

Bourne Again SHell 支持一些其他 shell 不支持的比较,例如 Busybox ash。列出了一些常见的陷阱here

仅 bash 支持与 [[ ... ]] 的具体比较,以及在比较中使用通配符 (*)。

如果您想使用 ash 进行匹配,可以尝试以下方法:

[ "$I" == "$N$A" ] # Match exactly
[ "$I" != "$I#$N$A" ] # Starts with
[ "$I" != "$I%$N$A" ] # Ends with

要检查一个字符串是否包含其他字符串,我想不出用 shell 表达式来做这件事的简单方法,ash 不支持像 $I/$N$A 这样的字符串替换。有多种工具可供选择,例如grepsed

使用grep 你可以这样做:

if echo $I|grep "$N$A" - > /dev/null; then ...

使用sed 你可以这样做:

[ -z $(echo "$I"|sed "/$N$A/d") ] # Contains

但是有很多方法可以实现这一点。

【讨论】:

嗨 Elijan9,你的解决方案还可以,但它不符合我的目的。让我用一个例子更清楚地解释它。 我在我的问题中添加了示例。请看一看。 grep 和 sed 示例都进行子字符串匹配。例如:if echo $I|grep "$N$A" - > /dev/null; then echo "sale is complete"; else echo "sale is declined"; fi @Elijan9 您好,请查看我关于busybox的帖子:***.com/questions/67089998/…【参考方案2】:

与这个问题有点无关,但我在尝试比较日期字符串时遇到了这篇文章,并认为它对任何有类似问题的人都有用。要在 ash 中的字符串上使用大于或小于,您需要在比较字符之前使用正斜杠:

str2="2020-1-1"
str3="2020-1-2"
# greater or less than
if [ "$str2" \> "$str3" ]; then
    echo "$str2 is greater then $str3"
elif [ "$str2" \< "$str3" ]; then
    echo "$str2 is less then $str3"
fi

【讨论】:

以上是关于比较 Busybox ash 中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

Ash(busybox提供的shell)教程[关闭]

字符串子串去重之后的个数

[在python中使用正则表达式搜索字符串子字符串

sql server 里类似replace的字符串子串删除

2022华为机试真题 C++ 实现 字符串子序列II