添加到数组(bash)

时间:2016-06-20 15:25:58

标签: bash

我目前正在尝试模拟一个简单版本的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提前帮助!

1 个答案:

答案 0 :(得分:1)

问题是您没有在以下行分配结果

j=j/2

将其更改为

((j=j/2))

当您将字符串j/2分配给$ j时,使用j/2作为算术表达式(在while条件下)尝试展开$j,但它会扩展为j/2 },所以它试图扩展$j等等。