我目前正在尝试模拟一个简单版本的Buddy算法。 此代码提取应模拟将进程添加到数组List中的过程,其中$ speicher =应格式化的RAM。 (变量是德语)$ prozess =添加到RAM中的进程。 当试图运行脚本时,我得到错误=第19行中的多次递归= arraySpeicher + =($ j / 2)。 (再次错误是德语,所以我不完全确定这是否是正确的错误) $ i应该有$ prozess的值,需要格式化以适合Buddy算法主体。
如何解决想要将格式化值添加到我的数组中的问题?
#!/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 :(得分:1)
问题是您没有在以下行分配结果
j=j/2
将其更改为
((j=j/2))
当您将字符串j/2
分配给$ j时,使用j/2
作为算术表达式(在while条件下)尝试展开$j
,但它会扩展为j/2
},所以它试图扩展$j
等等。