比较Busybox ash中的子串

时间:2016-08-26 09:28:38

标签: shell busybox

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

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

假设 [[$ I == $ N $ A]] - 此比较用于完全匹配,其中$ I是较大的字符串,$ N $ A包含$ I的子字符串。 我使用[-z $ {I ## $ N $ A *]和[“$ I”==“$ N $ A”*]语法来比较子字符串,但它失败了,并且表现得不像它应该的那样。 / p>

如果有任何人对此有任何建议,请指导。 如果有任何busybox ash的在线控制台我可以测试一些脚本,请告诉我。

示例已添加-27-08-16

假设 - 导出值$I = "Credit.saleApproved"的脚本 我正在传递$N= "Credit" and $A= ".sale"的价值 所以基本上回声 $ N $ A 是echo $ I 子串 我正在编写这个伪逻辑,以便更好地理解

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  

2 个答案:

答案 0 :(得分:2)

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

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

如果您想使用灰烬匹配,可以试试这些:

[ "$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

但是有很多方法可以达到这个目的。

答案 1 :(得分:0)

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