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


40

Вот СПИСОК:

List = "abcd 1234 jvm something"

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

Ответы:


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

Спасибо. Не могли бы вы дать несколько комментариев в коде, пожалуйста?
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.