这是我第一次访问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
答案 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}
这样的字符串替换。有多种工具可供选择,例如grep
和sed
。
使用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