Làm thế nào để có được các yếu tố từ danh sách trong bash?


40

Đây là một danh sách:

List = "abcd 1234 jvm something"

Làm thế nào để có được phần tử thứ hai "1234" mà không lặp tất cả danh sách?

Câu trả lời:


50

không có khoảng cách giữa dấu bằng

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

Một số cách khác, mặc dù không hiệu quả như sử dụng nội bộ của shell

$ 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

Cảm ơn. Bạn có thể cho một số ý kiến ​​trong mã xin vui lòng?
Sinh sản

1
Ý tôi là dòng thứ hai.
Sinh sản

17
@Spawn set -- $somethingchia rẽ $somethingtại $IFSnhân vật (bởi không gian mặc định) và chuyển nhượng các phần chia cho các biến vị trí $1, $2...
Benjamin Bannier

43

Chỉ để bổ sung câu trả lời của ghostdog: bạn cũng có thể đặt $Listcác phần tử của một mảng và truy cập phần tử danh sách cụ thể từ đó

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

Lưu ý rằng các chỉ số mảng được tính 0,1,2, ....

Điều này có lợi thế là không gây ô nhiễm môi trường shell với quá nhiều biến mới.


Thật tuyệt. :-)
SpawnST

1
không cần echo: arr=($List)
user31894

@ghostdog có lẽ bắt buộc hành vi, chỉnh sửa.
Benjamin Bannier

@BenjaminBannier, làm thế nào bạn có thể chọn nhiều yếu tố. Có một số cú pháp như $ {Array [1,2,3]} $ (không phải cái này, vì tôi đã thử, nhưng như thế này) hoặc tôi cần sử dụng một vòng lặp for.
Kvothe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.