2016-11-30 1 views
1

finde ich habe diesen Code:Speicher Wert in bash Array gibt [array] nicht

#!/bin/bash 
PIDS=$(ls -la /proc | awk '{print $9}' | grep "^[0-9]*$") 
PIDLIST=$(echo $PIDS | tr "" "\n") 
counter=0 
for PID in $PIDLIST; do 
    KERNEL[$counter]=$(cat "/proc/$PID/stat" | awk '{print $14 }') 
    counter=$((counter + 1)) 
done 

Ich versuche, den Inhalt von cat "/proc/$PID/stat" | awk '{print $14 }' Befehl in einem benannten KERNEL Array zu speichern, um eine Position durch einen Zähler gegeben.

Ich habe diesen Fehler:

mitop.sh: 8: mitop.sh: KERNEL[0]=26: not found 

Was mache ich falsch?

[email protected]:~$ bash --version 
GNU bash, versión 4.2.24(1)-release (i686-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
Licencia GPLv3+: GPL de GNU versión 3 o posterior <http://gnu.org/licenses/gpl.html> 
+0

Was passiert, wenn Sie -a kernel 'vor Ihrer 'for' Schleife hinzufügen' erklären? – eddiem

+0

Verwendung von declare -> mitop.sh: 6: mitop.sh: declare: nicht gefunden und ich benutze Version 4.X – colymore

+0

Führen Sie das Skript mit './Mitop.sh' oder auf andere Weise, zum Beispiel 'sh./mitop.sh'? Es ist wichtig. – janos

Antwort

6

I am using sh ./mitop.sh

Das ist das Problem. Sie führen das Skript nicht mit Bash aus. Sie führen es mit /bin/sh, die sehr unterschiedlich ist. Sie müssen es so laufen:

./mitop.sh 

Oder wie folgt aus:

bash ./mitop.sh 

Dieses letzte man nur für Plausibilitätsprüfung ist. Die empfohlene Methode zum Ausführen von Shell-Skripten ist ./the_script.sh, , damit die erste Zeile entscheiden kann, wie sie ausgeführt werden soll.

Auch kann das Skript besser geschrieben werden, empfehle ich auf diese Weise:

#!/bin/bash 
kernel=() 
for file in /proc/[0-9]*; do 
    read -a fields < "$file"/stat 
    kernel+=("${fields[13]}") 
done