2016-11-17 29 views
0

以下のシェルスクリプトはbashシェルで完璧に動作します。しかし、アンドロイドシェルでエラーを生成します。アンドロイドが使用しているシェルで何かをしなければならないかもしれません。しかし、どうすればそれを解決できますか?完璧な解決策ではない場合は、ハックも私のために行います。シェルスクリプトはbashで動作しますが、 'adbシェル'では動作しません

シェルスクリプト:アンドロイドシェルで

func() 
{ 
    local x 
    x=${1:3:1} 
    echo "x - $x" 
    if [ "${x}" = " " -o -z "${x}" ]; then 
     a="M" 
    else 
     a="S" 
    fi 
    echo "A - ${a} X - {x}" 
} 

func "abc=efg" 

O/P、bashシェル(Linux)の上

root:/ # sample.sh             
x - = 
/system/bin/sample.sh[14]: [: =: missing second argument 
A - S X - {x} 

O/P:

PC:~$ ./sample.sh 
x - = 
A - S X - {x} 
+0

スクリプトは '#!/ bin/bash'で始まりますか? – Barmar

+0

@Barmarはい。これはbashシェルの#!/ bin/bashとAndroidシェルの#!/ system/bin/shから始まります。 –

+0

Androidのbashのバージョンは? – Barmar

答えて

2

の値$xはちょうど=です。それは次のようになります:

if [ = = " " -o -z = ]; then 

これは明らかにオペレータではなく値でなければならない=によって混乱しています。

変更を:

if [ "x${x}" = "x " -o "x${x}" = "x" ]; then 
+0

Barmarさんに感謝します。私はしばらくそれを試し、あなたに戻ってきます。 Bdwには、Androidシェルのシェルタイプを見つける方法がありますか? –

+0

わかりません。私が見つけたことから、それはADB特有のものだと思われます。 – Barmar

+0

mkshシェルですね。 Alexはちょうど質問のコメントセクションにリンクを追加しました。私はもっ​​と確認します.. –

2

adbのシェルはダッシュでもあるのBSD灰の直系の子孫でした。 adbシェルの詳細はrecent android versions is mkshstandard shell of non-emulator builds on Android 4.0 and newerです。

エラーテキストから、シェルがmkshバージョンである可能性があります。

アンドロイドのmkshは大幅に変更されて改良されているため、ダッシュをターゲットシェルとして使用することをお勧めします。これはほとんどのLinuxディストリビューションで利用でき、debianと派生物のデフォルトのシステムシェルです。これは機能は少なくなっていますが、dashで動作するものはadbのmkshでは動作しません。

{1:3:1}特に

、この式:

x=${1:3:1} 

は(mkshで、それはしかし、作業を行う)ダッシュで意味を持ちません。少し長く

x=${1#???}; x=${x%"${x#?}"} 

が、どのシェルで仕事を取得します。これはこれで置き換えることができます。

[

はまた、[…]テストに問題がある、信頼できるとあまりにも多くの「部品」を持っているようです。

if [ "${x}" = " " ] || [ -z "${x}" ]; then 

||でもあるか、(&&と同じ嗜好を持つ)2つ(又は必要に応じてそれ以上)にテストを分割することは、通常の治療薬です。
どのシェルでも動作します。私たちのようにスクリプト全体を取得

echo "A - ${a} X - ${x}" 

:最終的な変更(変数xのための行方不明$)で

func() 
{ 
    local x 
    x=${1#???}; x=${x%${x#?}} 
    echo "x - $x" 
    if [ "${x}" = " " ] || [ -z "${x}" ]; then 
     a="M" 
    else 
     a="S" 
    fi 
    echo "A - ${a} X - ${x}" 
} 

func "abc=efg" 

とダッシュ、bashやmkshでそれを実行しているが、与え:

x - = 
A - S X - = 
関連する問題