2014-12-16 22 views
6

Ich verstehe, dass dies schon einmal gefragt wurde, aber die Antwort gibt mir nicht, was ich brauche. Ich pgrep für eine gegebene Zeichenfolge, die eine Liste von PIDs zurückgibt, die diese Zeichenfolge in einer Variablen enthalten (in diesem Fall $ testpid). Ich dann versuchen, jede einzelne der aus der PID gespalten, werden sie mit einem Raum sepereated etwa so:Variable in mehrere Variablen teilen

PIDS:

17717 172132 2138213 

Code:

IFS=" " read -a pidarray <<< "$testpid" 
echo pidarray[0] 

* anstelle des Echos über i jedes Element im Array eine eigene Variable würde die Zuordnung

Aber ich erhalte den folgenden Fehler:

syntax error: redirection unexpected 
+4

Diese "Umleitung unerwartet" ist, was Sie erhalten würden, wenn Ihre Shell nicht wirklich bash wäre. –

+0

Ihre Frage und der Titel scheinen darauf hinzudeuten, dass Ihr Problem darin bestand, die PIDs in mehrere Variablen aufzuteilen, aber Sie haben eine Antwort akzeptiert, die sich mit einem anderen Problem befasst. Wenn dies in der Tat das ist, was Sie wollten, denken Sie bitte daran, den Titel und die Frage entsprechend zu formulieren. – TTT

+0

@TTT, ein ausgezeichneter Punkt - Ich habe ziemlich über die Notiz beschönigt, dass die eigentliche Absicht dann war, die Array-Elemente ihren eigenen Variablen zuzuweisen; In diesem Fall muss kein Array verwendet werden. Antwort wurde entsprechend geändert. –

Antwort

5

Ihre Syntax war fast richtig:

IFS=' ' read -r -a pidarray <<< "$testpid" 
echo "${pidarray[0]}" 

Beachten Sie die geschweiften Klammern für das Array dereferenzieren benötigt.

Noch wichtiger, überprüfen Sie, ob Ihr Shebang #!/bin/bash ist, oder dass Sie Ihr Skript mit bash yourscript, nicht sh yourscript ausgeführt haben. Der angegebene Fehler ist konsistent mit einer Shell, die <<< nicht als gültige Syntax erkennt - welche jede remote moderne Bash immer wenn sie als bash aufgerufen wird; Auch wenn /bin/sh auf dieselbe ausführbare Datei verweist, teilt es bash mit, viele seiner Erweiterungen aus der POSIX-Spezifikation zu deaktivieren.


Nun, dass die - wenn Ihr Ziel jeden Eintrag eine eigene Variable zuzuordnen ist, Sie (verwenden und sollte nicht) überhaupt nicht brauchen read -a!

Statt:

IFS=' ' read -r first second third rest <<<"$testpid" 
printf '%s\n' "First PID is $first" "Second PID is $second" 
+0

Auch '/ bin/sh' unterstützt nicht das Lesen von Arrays, nur:' lesen [-p prompt] [-r] Variable [...] ' – D3Hunter

+0

@jujj, tatsächlich; 'sh' unterstützt überhaupt keine Arrays, aber wir kommen nicht dazu, wenn wir vor dem Aufruf von' read' einen Syntaxfehler bekommen, weshalb ich es nicht erwähnenswert finde. –

+0

Und wenn Sie eine variable Anzahl von Argumenten haben, können Sie sie durch Schleifen und den 'eval' Befehl, z. wie 'für i in {1..3}; eval "var $ i = $ i"; fertig. Allerdings weiß ich nicht, warum du in so einem Fall von einem Array wegkommen solltest. – TTT

1

Sie können versuchen diese.

testpid="17717 172132 2138213" 
set -- $testpid 
echo -e $1 $2 

Danach verwenden Sie die $1,$2,$3, um das separat zu bekommen.

+1

Was würde das "Set - $ testpid" nicht tun, ohne den Overhead der Subshell? –

+1

Um klar zu sein - ich denke, dass, wenn es modifiziert wird, um die Ineffizienz zu beheben (und vielleicht mit mehr expliziten Hinweis auf die Nebenwirkungen - da es die Argumentliste überschreibt) ist dies eine gute Antwort. –

+1

... obwohl es auch ein Problem im allgemeinen Fall von globbing hat - der 'read -r -a' Ansatz wird ein' * 'in ein Array-Element als ein Literal setzen, wohingegen dies durch eine Liste von ersetzt wird Dateinamen im aktuellen Verzeichnis. Kein Problem mit PIDs, aber anderswo vielleicht ein Problem. –