W linux bash istnieje coś podobnego do następującego kodu w PHP:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
tj. przypisujesz w jednym zdaniu odpowiednią wartość do 3 różnych zmiennych.
Powiedzmy, że mam funkcję bash, myBashFuntion
która zapisuje na stdout łańcuch „qwert asdfg zxcvb”. Czy można zrobić coś takiego:
(var1 var2 var3) = ( `myBashFuntion param1 param2` )
Część po lewej stronie znaku równości nie jest oczywiście poprawną składnią. Próbuję tylko wyjaśnić, o co proszę.
Co jednak działa, to:
array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}
Ale tablica indeksowana nie jest tak opisowa, jak zwykłe nazwy zmiennych.
Mogłem jednak po prostu zrobić:
var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
Ale to są jeszcze 3 stwierdzenia, których wolałbym uniknąć.
Szukam tylko składni skrótu. Czy to możliwe?
linux
bash
shell
variable-assignment
multiple-variable-return
Uwolnić się
źródło
źródło
read -d "\n" v1 v2 <<<$(cmd)
działa doskonale. Dziękuję Ci!echo
jest bezcelowy, ale używałem tej techniki do zwracania wielu wartości ze skryptu, który zwracał mi uwagę na status zwrotu. Pomyślałem, że podzielę się swoimi odkryciami.read -r
:do not allow backslashes to escape any characters
Chciałem przypisać wartości do tablicy. Tak więc, rozszerzając podejście Michaela Krelina , zrobiłem:
co daje:
zgodnie z oczekiwaniami.
źródło
a=( $(echo 2 4 6) ) ; echo ${a[0]} ${a[1]} ${a[2]}
read -r
:do not allow backslashes to escape any characters
Myślę, że to może pomóc ...
Aby rozbić daty wprowadzone przez użytkownika (mm / dd / rrrr) w moich skryptach, przechowuję dzień, miesiąc i rok w tablicy, a następnie umieszczam wartości w oddzielnych zmiennych w następujący sposób:
źródło
IFS=/ read -r m d y < <(echo 12/29/2009)
Czasami trzeba zrobić coś fajnego. Powiedzmy, że chcesz czytać z polecenia (na przykład data przez SDGuero), ale chcesz uniknąć wielu rozwidleń.
Możesz również przesłać potokiem do polecenia odczytu, ale wtedy musiałbyś użyć zmiennych w podpowłoce:
prowadzi do...
źródło
read
Komenda się nie dzieje w podpowłoce powodu szelki, to dlatego, że masz polecenie odczytu po prawej stronie rury. Musisz uruchomićread
polecenie w bieżącej powłoce, co możesz zrobić jakread day month year <<< `date "+%d %m %Y"`
read
zdarza się, ale zakres zmiennych, do których wczytuje, wykracza poza zakres, gdy kończy się podpowłoka potoku.Rozdział 5 książki kucharskiej Bash autorstwa O'Reilly omawia (dość obszernie) powody, dla których w przypisaniu zmiennej nie ma spacji wokół znaku „=”
Wyjaśnienie ma coś wspólnego z rozróżnieniem między nazwą polecenia a zmienną (gdzie „=” może być prawidłowym argumentem).
To wszystko wydaje się trochę jak uzasadnianie po zdarzeniu, ale w każdym razie nie ma wzmianki o sposobie przypisywania do listy zmiennych.
źródło
;
” jest ważnym argumentem? Kiedy piszęls ; cd
to nadal dzwonils
icd
mimo spacji. Jeśli chcę wyświetlić listę nazwanych katalogów;
icd
mogę po prostu wpisaćls ';' cd
.