2016-08-26 28 views
0

這是我第一次在stackoverflow。我目前面臨一個問題,並在這裏分享細節。在Busybox ash中比較子串

我目前正在構建POS自動化腳本。 POS終端具有Shell Busybox灰。這就是爲什麼不能使用基本命令,因爲那些行爲不一樣。 下面是查詢:

假設 [$ I == $ N $ A]] - 這個比較是完全匹配,其中$我是更大的字符串,$ N $ A包含$我的子。 我已經使用了[-z $ {I ## $ N $ A *]和[「$ I」==「$ N $ A」*]語法來比較子字符串,但它失敗了,而且行爲不像它應該那樣。

如果任何人有任何建議,請指導。 請讓我知道,如果有任何在線控制檯busybox灰,我可以測試一些腳本。

例新增-27-08-16

想 - 腳本導出值$I = "Credit.saleApproved" 和我傳遞的價值$N= "Credit" and $A= ".sale"
所以基本上呼應$ N $ A是一個子串回聲$ 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

您是否想要完全匹配,開始匹配或包含灰匹配? – Elijan9

+0

是的。我正在尋找一個確切的子字符串匹配。 –

回答

0

Bourne Again SHell支持不被其他炮彈,如Busybox的ash支持一些比較。一些常見的陷阱已被列入here

[[ ... ]]的具體比較僅受bash支持,以及在比較中使用通配符(*)。

如果您想使用灰搭配,你可以嘗試這些:

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

要檢查一個字符串是否包含其他字符串,我能想到的沒有簡單的方法來做到這一點與外殼表情,灰不支持字符串替換,如${I/$N$A}。有多種工具可供選擇,例如grepsed

使用grep你可以這樣做:

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

使用sed你可以這樣做:

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

但也有許多方法來實現這一目標。

+0

嗨Elijan9,烏爾解決方案是好的,但它不符合我的目的。讓我用一個例子更清楚地解釋它。 –

+0

我已經爲我的問題添加了示例。請看一看 。 –

+0

grep和sed示例都執行子字符串匹配。例如:'if echo $ I | grep「$ N $ A」 - >/dev/null;然後回聲「銷售完成」;其他回聲「銷售被拒絕」; fi' – Elijan9