jak podzielić ciąg przed i przed spacją w skrypcie powłoki?

19

Mam zmienną, która pokazuje na echu w ten sposób

$ echo $var
129 148

Muszę wziąć tylko 129 jako wynik. Jak podzielę 129 i 148?

surbhi
źródło
echo "${var% *}" && echo "${var#* }"...
jasonwryan
możliwy duplikat Jak działają $ {0 ## * /} i $ {0% / *}?
jasonwryan

Odpowiedzi:

33

Oprócz sugestii Jasonwryana możesz użyć cut:

echo $var | cut -d' ' -f1

Powyżej cutjest echowyjściem z separatorem spacji ( -d ' ') i wyprowadza pierwsze pole ( -f1)

Joseph R.
źródło
to nie działa. już go użyłem. mówi, że polecenie nie zostało znalezione.
surbhi,
3
@surbhi Co mówi polecenie nie znaleziono polecenia? cutjest standardowym narzędziem. Twój skrypt prawdopodobnie zawiera błąd w innym miejscu. Mówiąc bardziej ogólnie, nigdy nie mów „to nie działa”. Zawsze mów dokładnie, jaki kod uruchomiłeś, dokładnie co się stało, i kopiuj i wklej komunikaty o błędach.
Gilles „SO- przestań być zły”
Ta odpowiedź powinna zostać zaakceptowana, ponieważ jest to najbardziej zwięzły i bezpośredni sposób. Oczywiście nie będzie działać w przypadkach, które są bardziej skomplikowane niż podany przykład.
Dan Nguyen
10

Świetnym sposobem na to jest użycie tablicy bash, aby podzielić ciąg znaków na spacje. Możesz zadeklarować tablicę za pomocą nawiasów:

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"
gogoud
źródło
to mówi, że polecenie nie zostało znalezione
surbhi,
To zależy od tego, czy używasz bash. Jeśli używasz innej powłoki, może nie działać. echo $SHELLpowinien pokazywać: /bin/bashlub podobny.
gogoud
nie działa zsh; (
TonyH
Działa to w ZSHzoom="one two three"; declare -a zoomie=( $( echo $zoom | cut -d' ' -f1- ) ); echo ${zoomie[2]};
TonyH