2016-06-20 11 views
1

私は現在、単純なバージョンのバディアルゴリズムをシミュレートしようとしています。 このコードの抽出は、配列を$ speicher =フォーマットするRAMに追加するプロセスをシミュレートする必要があります。 (変数はドイツ語です)$ prozess = RAMに追加されるプロセス。 スクリプトを実行しようとすると、19行目= arraySpeicher + =($ j/2)でエラー=再帰が多く発生します。 (もう一度エラーがドイツ語になっていますので、正しいエラーがあるかどうかは完全にわかりません) $ iは、バディアルゴリズムプリンシパルに合うようにフォーマットする必要がある$ prozessの値を持つ必要があります。配列に追加する(bash)

フォーマットされた値を配列に追加したいという問題を解決するにはどうすればよいですか?

#!/bin/bash 
echo "Wie groß ist ihr Arbeitsspeicher?: " 
read speicher 
#Einlesen des Arbeitsspeichers 
echo "Wie groß ist ihr Prozess den sie dem Speicher hinzufügen wollen?: " 
read prozess 

if ((prozess < 0)); then 
    echo "Dein Prozess ist zu klein & hat keine relevante Größe." 
    exit 
    fi 

arraySpeicher=($speicher) 
arrayName=() 

for i in "${arraySpeicher[@]}"; do 
    if (($prozess <= $i)); then 
     j=$i 
     unset arraySpeicher[$i] 
     while (($prozess < $j/2)); do 
      arraySpeicher+=($j/2) 
      ((j=j/2)) 
      done 
     arraySpeicher+="p ${#ArrayName[@]}" 
     arrayName+=$prozess 

    fi 
    done 

echo "Dies ist ihr Speicher ${arraySpeicher[@]} nach hinzufügen des Prozesses." 

while ((true)); do 
    PS3="Möchten sie einen Prozess hinzufügen/entfernen/aufhören?" 
    select eingabe in hinzfügen entfernen aufhören 
    do 

if (($eingabe == hinzufügen)); then 
    echo "wie groß ist der Prozess?:" 
    read prozess 

    if ((prozess < 0)); then 
     echo "Ihr Prozess ist zu klein." 
     exit 
     fi 

    for i in "${arraySpeicher[@]}"; do 
     if (($i == int)) #TODO: nur zahlen dürfen behandelt werden, prozesse nicht!! 
     if (($prozess <= $i)); then 
      j=$i 
      unset arraySpeicher[$i] 
      while (($prozess < $j/2)); do 
       arraySpeicher+=($j/2) 
       ((j=j/2)) 
       done 
      arraySpeicher+="p ${#ArrayName[@]}" 
      arrayName+=$prozess 

      break 
     fi 
     echo "Dies ist ihr Speicher ${arraySpeicher[@]} nach hinzufügen des Prozesses." 
     fi 
     done  


if (($eingabe == entfernen)); then 
echo "Welchen Prozess willst du entfernen:?" 
read antwort 
p=arrayName[$antwort] 
z=1 
while (($z < $p)); do 
z=((z*2)) 
done 

#TODO: stelle muss die position von dem gewünschten Prozess("p"+$antwort) in dem arraySpeicher beinhalten! 
arraySpeicher[$stelle]=z 

h=1 
while (($h == 1)); do 
h=2 
for i in "${arraySpeicher[@]}"; do 
if ((i < "${#arraySpeicher[@]}"-1)); then 
if ((arraySpeicher[$i] == arraySpeicher[$i+1])); then 
unset arraySpeicher[$i+1] 
arraySpeicher[$i]=((arrayspeicher[$i]*2)) 
h=1 
fi 
fi 
done 
done 

fi 

if (($eingabe == aufhören)); then 
break 
fi 
done 
done 

編集:私は今のところ完全なコードを入れています。まだいくつかの作業が必要ですが、コメントを追加してコードをインデントする必要があります。うまくいけば、このスクリプトは完了です!事前にヘルプのためのthx!

+0

スクリプトをテストできるように入力してください。 – choroba

答えて

1

問題は、$ jに文字列j/2をASSINGときのようにj/2を使用して、

((j=j/2)) 

に変更し、それを

j=j/2 

次の行に結果を割り当てないということです算術式(while条件)は、$jを展開しようとしますが、j/2に展開されますので、$jなどを展開しようとします。

+0

ありがとうございます。それはコンパイルされました。しかし今、私の問題は、私の配列には、私が望んでいない値のリストがあり、私が明らかに望んでいないような方法で表示されています。 echo "Dies ist ihr Speicher $ {arraySpeicher [@]} nachhinzufügendes Prozesses " は次のとおりです:Dies ist ihr Speicher 1024p 0 1024/2 512/2 nachhinzufügendes Prozesses。 私は、それが正しい形式にフォーマットされている空き容量= 512 256 P1(プロセス1) – ThePretender73

+0

あなたの問題をシミュレートするために入力を発明せずに直接実行できるスクリプトを提供してください。 – choroba

+0

speicherは512,1024,2048などのようにすべきです... prozessは望みの高さにすることができます(これは別のユーザーが使用するためのものではなく、スクリプトの仕組みを示す必要があるため、RAMよりも高いプロセスを選択する必要があります)ここに。) – ThePretender73