2014-12-16 10 views
6

Rozumiem, że zostało to wcześniej zadane, ale odpowiedź nie daje mi tego, czego potrzebuję. Pgrep dla danego ciągu, który zwraca listę PID zawierających ten ciąg w zmiennej (w tym przypadku $ testpid). I spróbuj i podzielić każdy z zewnątrz PID, są sepereated z miejscem tak:Podział zmiennej na wiele zmiennych

PIDS:

17717 172132 2138213 

Kod:

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

* zamiast echo Powyższe I przypisałby każdy element tablicy do własnej zmiennej

Ale pojawia się następujący błąd:

syntax error: redirection unexpected 
+4

To "przekierowanie nieoczekiwane" jest tym, co otrzymalibyśmy, gdyby twoja powłoka nie była w rzeczywistości bash. –

+0

Twoje pytanie i tytuł wydają się wskazywać, że Twoim problemem było podzielenie PID na wiele zmiennych, ale zaakceptowałeś odpowiedź, która dotyczy innego problemu. Jeśli jest to w rzeczywistości to, czego potrzebujesz, rozważ odpowiednie przeformułowanie tytułu i pytania. – TTT

+0

@TTT, doskonały punkt - dość pomrukiwałem nad uwagą, że faktycznym zamiarem było wtedy przypisanie elementów tablicy do ich własnych zmiennych; w tym przypadku nie ma potrzeby korzystania z tablicy. Odpowiednio poprawiona odpowiedź. –

Odpowiedz

5

składni prawie poprawne:

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

Uwaga nawiasy klamrowe potrzebne do dereference tablicy.

Co ważniejsze, sprawdź, czy Twój shebang to #!/bin/bash, czy też wykonałeś skrypt przy użyciu bash yourscript, a nie sh yourscript. Podany błąd jest zgodny z powłoką, która nie rozpoznaje <<< jako prawidłowej składni - co każde zdalnie nowoczesne bash będzie zawsze , gdy zostanie wywołane jako bash; nawet jeśli /bin/sh wskazuje na ten sam plik wykonywalny, mówi bash, aby wyłączyć wiele jego rozszerzeń ze specyfikacji POSIX.


Teraz powiedział, że - jeśli twoim celem jest, aby przypisać każdy wpis do własnej zmiennej, nie trzeba (i nie należy używać) read -a w ogóle!

Zamiast:

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

Również '/ bin/sh' nie obsługuje odczytu tablicy, tylko:' read [-p prompt] [-r] variable [...] ' – D3Hunter

+0

@jujj, indeed; 'sh' w ogóle nie obsługuje tablic, ale nie osiągamy tego, jeśli trafiamy na błąd składni przed wywołaniem' read', więc nie uważałem, że warto o tym wspomnieć. –

+0

Jeśli masz zmienną liczbę nadchodzących argumentów, możesz obsłużyć je za pomocą pętli i komendy 'eval', np. jak 'for i in {1..3}; eval "var $ i = $ i"; done'. Chociaż nie wiem, dlaczego i tak chciałbyś uciec od tablicy w takim przypadku. – TTT

1

Można próbować ten jeden.

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

Następnie użyj $1,$2,$3 aby ta oddzielnie.

+1

Co to oznacza, że ​​'set - $ testpid' nie będzie, bez całego nakładu podpowłoki? –

+1

Dla jasności - myślę, że jeśli zmodyfikowano by naprawić nieskuteczność (i, być może, bardziej wyraźną notą o skutkach ubocznych - ponieważ to on nadpisuje listę argumentów), to jest dobra odpowiedź. –

+1

... chociaż ma również problem w ogólnym przypadku globowania - metoda 'read -r-a' wstawi' * 'do elementu tablicy jako literał, podczas gdy zastąpi to listą nazwy plików w bieżącym katalogu. Nie jest to problem z PID, ale może problem gdzie indziej. –

Powiązane problemy