2014-12-16 19 views
6

Capisco che questo è stato chiesto prima, ma la risposta non mi dà proprio quello di cui ho bisogno. Ho pgrep per una data stringa che restituisce una lista di PID contenente quella stringa in una variabile ($ testpid in questo caso). Allora provo e dividere ognuno di fuori del PID, sono sepereated con uno spazio in questo modo:Dividi la variabile in più variabili

PIDS:

17717 172132 2138213 

Codice:

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

* invece dell'eco sopra i sarebbe assegnando ad ogni elemento dell'array alla variabile

Ma io ottenere il seguente errore:

syntax error: redirection unexpected 
+4

Quel "reindirizzamento imprevisto" è ciò che otterresti se la tua shell non fosse in realtà bash. –

+0

La tua domanda e il titolo sembrano indicare che il tuo problema è stato quello di suddividere i PID in più variabili, ma hai accettato una risposta che si occupa di un problema diverso. Se questo è in realtà ciò che volevi, ti preghiamo di prendere in considerazione la riformulazione del titolo e della domanda di conseguenza. – TTT

+0

@TTT, un punto eccellente - ho piuttosto sorvolato la nota che l'intento effettivo era quindi quello di assegnare gli elementi dell'array alle proprie variabili; in questo caso non è necessario utilizzare un array. Risposta modificata opportunamente –

risposta

5

la sintassi era quasi corretto:

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

Nota le parentesi graffe necessari per la dereference array.

Ancora più importante, controllare che il vostro baracca è #!/bin/bash, o che eseguite lo script con bash yourscript, non sh yourscript. L'errore fornito è coerente con una shell che non riconosce la sintassi <<< come sintassi valida - che qualsiasi bash remota in remoto sarà sempre quando invocato come bash; anche se /bin/sh punta allo stesso eseguibile, dice a bash di disabilitare molte delle sue estensioni dalle specifiche POSIX.


Ora, che ha detto - se il tuo obiettivo è quello di assegnare ogni voce alla propria variabile, non è necessario (e non utilizzare) read -a a tutti!

Invece:

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

Inoltre, '/ bin/sh' non supporta la lettura dell'array, solo:' leggi [-p prompt] [-r] variabile [...] ' – D3Hunter

+0

@jujj, infatti; 'sh' non supporta affatto gli array, ma non ci arriviamo se si verifica un errore di sintassi prima di richiamare' read', quindi non ho ritenuto opportuno menzionarlo. –

+0

E se hai un numero variabile di argomenti in arrivo, puoi gestirli tramite il looping e il comando 'eval', ad es. come 'per i in {1..3}; eval "var $ i = $ i"; done'. Tuttavia, non so perché vorresti allontanarti da un array in un caso del genere, comunque. – TTT

1

Si può provare questo uno.

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

Dopo di che utilizzare la $1,$2,$3 per ottenere che separatamente.

+1

Cosa vuol dire che 'set - $ testpid' non lo farebbe, senza tutto il sovraccarico della subshell? –

+1

Per essere chiari - penso che se modificato per correggere l'inefficienza (e, forse, con una nota più esplicita degli effetti collaterali - dato che sovrascrive l'elenco degli argomenti) questa è una buona risposta. –

+1

... sebbene abbia anche un problema nel caso generale del globbing - l'approccio 'read -r -a' metterà un' * 'in un elemento dell'array come un letterale, mentre questo lo sostituirà con un elenco di nomi di file nella directory corrente. Non è un problema con PID, ma forse un problema altrove. –

Problemi correlati