繁体   English   中英

比较 Busybox ash 中的子字符串

[英]compare substrings in Busybox ash

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

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

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

如果有人对此有任何建议,请指导。 请让我知道是否有任何用于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  

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

特别是与[[ ... ]]比较仅支持 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

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

与该问题有点无关,但我在尝试比较日期字符串时遇到了这篇文章,并认为它对任何有类似问题的人都有用。 要在 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

由于我在搜索如何做完全相同的事情时最终来到这里,使用CONFIG_ASH_BASH_COMPAT=y编译的 Busybox 我最终使用了等效的:

if [[ "${I//$N$A}" != "$I" ]
then
  echo "sale is complete"  
else  
  echo "sale is declined"  
fi   

即,使用模式替换运算符尝试删除我正在寻找的 substring,如果它修改了它确实包含 substring 的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM