jak zdobyć elementy z listy w bash?

40

Oto LISTA:

List = "abcd 1234 jvm something"

Jak zdobyć drugi element „1234” bez zapętlania całej listy?

SpawnST
źródło

Odpowiedzi:

50

bez spacji między znakiem równości

$ List="abcd 1234 jvm something"
$ set -- $List
$ echo $2
1234

Niektóre inne sposoby, choć nie tak wydajne jak używanie wewnętrznych elementów powłoki

$ echo $List | cut -d" " -f2
1234
$  echo $List | awk '{print $2}'
1234
$ echo $List | sed 's/^.[^ \t]* //;s/ .*//'
1234
$ echo $List | tr " " "\n"|sed -n '2p'
1234
użytkownik31894
źródło
Dzięki. Czy mógłbyś podać jakieś uwagi w kodzie?
SpawnST
1
Mam na myśli drugą linię.
SpawnST
17
@Spawn set -- $somethingrozłamów $somethingw $IFScharakterze (domyślnie spacja) i przypisuje częściach Splitu do zmiennych pozycyjnych $1, $2...
Benjamin Bannier
43

Tylko w celu uzupełnienia odpowiedzi ghostdog: możesz również umieścić $Listelementy w tablicy i stamtąd uzyskać dostęp do określonego elementu listy

List="abcd 1234 jvm something"
arr=($List)
echo ${arr[1]}

Zauważ, że indeksy tablicowe są zliczane 0,1,2, ....

Ma to tę zaletę, że nie zanieczyszcza środowiska powłoki zbyt dużą liczbą nowych zmiennych.

Benjamin Bannier
źródło
To miło. :-)
SpawnST
1
nie trzeba echo: arr=($List)
user31894
@ghostdog prawdopodobnie kompulsywne zachowanie, zredagowane.
Benjamin Bannier
@BenjaminBannier, jak wybrać wiele elementów. Czy istnieje jakaś składnia, taka jak $ {arr [1,2,3]} $ (nie to, ponieważ próbowałem, ale tak to), czy też muszę użyć pętli for.
Kvothe