как получить элементы из списка в Bash?

40

Вот СПИСОК:

List = "abcd 1234 jvm something"

Как получить второй элемент «1234» без зацикливания всего списка?

SpawnST
источник

Ответы:

50

нет пробелов между знаком равенства

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

Некоторые другие способы, хотя и не такие эффективные, как использование внутренних компонентов оболочки

$ 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
user31894
источник
Спасибо. Не могли бы вы дать несколько комментариев в коде, пожалуйста?
SpawnST
1
Я имею в виду вторую строку.
SpawnST
17
@Spawn set -- $somethingрасколов $somethingна $IFSхарактер (по умолчанию пробел) и правопреемников расщепленные части к позиционных переменных $1, $2...
Бенджамин Bannier
43

Просто в дополнение к ответу ghostdog: вы также можете поместить $Listэлементы в массив и получить доступ к конкретному элементу списка оттуда

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

Обратите внимание, что индексы массива насчитывают 0,1,2, ....

Преимущество этого состоит в том, что вы не загрязняете среду оболочки слишком большим количеством новых переменных.

Бенджамин Банье
источник
Это хорошо. :-)
SpawnST
1
не нужно echo: arr=($List)
user31894
@ghostdog, вероятно, навязчивое поведение, отредактировано.
Бенджамин Банье
@ BenjaminBannier, как вы можете выбрать несколько элементов. Есть ли какой-то синтаксис, такой как $ {arr [1,2,3]} $ (не так, поскольку я пытался, но так), или мне нужно использовать цикл for.
Kvothe