Điểm:0

Làm cách nào để tách các giá trị dữ liệu khác nhau trong danh sách và gán cho các biến trong tập lệnh Shell?

lá cờ ca

Giả sử tôi có một danh sách dữ liệu trong tập lệnh shell như thế này:

Danh sách dữ liệu = ["
Con mèo
Chú chó
Con thỏ
Chuột bạch
chuột đồng
"]

Bây giờ, tôi sẽ làm cách nào để thiết lập từng giá trị dữ liệu riêng biệt trong danh sách dưới dạng biến? Như thế này:

$Value0 = "Mèo"
$Valu1 = "Chó"
$Value2 = "Con thỏ"
$Value3 = "GuineaPig"
$Value4 = "Chuột đồng"

Đối với bản ghi, tôi đã quen thuộc với các tiện ích dòng lệnh như Grep, AWK và SED. Tuy nhiên, tôi không chắc bắt đầu từ đâu với những thứ như thế này.

Ngoài ra, đối với hồ sơ, lớp vỏ ưa thích của tôi là Cá, tuy nhiên, vui lòng trả lời ở định dạng BASH hoặc SH. Đừng lo lắng, tôi có thể dịch.

Điểm:3
lá cờ ca

Không chắc chắn về những gì bạn cần. không giúp đỡ à?

#!/bin/bash
DataList=(
Con mèo
Chú chó
Con thỏ
Chuột bạch
chuột đồng
)

cho tôi trong {0..4}
làm
    value[$i]=${DataList[$i]}
    tiếng vang "giá trị[$i] = ${giá trị[$i]}"
xong

đầu ra:

giá trị[0] = Con mèo
giá trị[1] = Con chó
value[2] = Con thỏ
value[3] = Chuột lang
value[4] = Chuột đồng
MissBrae avatar
lá cờ ca
Không, điều đó không giúp được gì. Tôi đang tìm cách phân tích các chuỗi trong danh sách và thêm chúng vào các biến riêng biệt. Tôi có nghĩa là những gì tôi đã viết theo nghĩa đen. Tôi không muốn lấy một chuỗi ngẫu nhiên ra khỏi danh sách.
NotTheDr01ds avatar
lá cờ vn
@MissBrae Công bằng mà nói, giải pháp ở đây có vẻ như có thể dễ dàng mở rộng cho trường hợp sử dụng của bạn. Nếu bạn có một số mục cố định (dường như bạn phải có, nếu bạn đang phân tích cú pháp chúng thành các biến tĩnh), thì bạn có thể dễ dàng làm theo ví dụ của @jpbrain với `$mem0 = $value[0]; $mem1= $value[1]; v.v`. Tôi đã thay thế "giá trị" bằng "mem" vì từ các nhận xét khác, đó là những gì bạn đang cố phân tích cú pháp.
Điểm:1
lá cờ vn

Vì lớp vỏ ưa thích của bạn là Cá nên tôi sẽ đưa ra ba tùy chọn.

Đầu tiên, đưa ra Danh sách dữ liệu ở định dạng chuỗi, bạn có thể sử dụng tách chuỗi để chia các dòng riêng lẻ thành một danh sách thực tế:

> đặt Danh sách dữ liệu "
  Con mèo
  Chú chó
  Con thỏ
  Chuột bạch
  chuột đồng
  "

> đặt --show DataList

$DataList: được đặt trong phạm vi toàn cầu, chưa được xuất, với 1 phần tử
$DataList[1]: |\nMèo\nChó\nThỏ\nGuineaPig\nHamster\n|

> đặt Giá trị (tách chuỗi -n \n "$DataList")
> đặt --show Giá trị

$Value: được đặt trong phạm vi toàn cầu, chưa được xuất, có 5 thành phần
$Value[1]: |Mèo|
$Value[2]: |Con chó|
$Value[3]: |Con thỏ|
$Value[4]: |GuineaPig|
$Value[5]: |Hamster|

> tiếng vang $Value[2]

Chú chó

^ Các dòng trống trong ví dụ hoàn toàn để dễ đọc và không xuất hiện trong đầu ra thực tế

Nhưng nếu bạn có thể, chỉ cần nhúng dữ liệu dưới dạng danh sách theo nghĩa đen vào tập lệnh và tránh thêm tách chuỗi:

> đặt DataList "Cat" \
  "Chú chó" \
  "Con thỏ" \
  "Chuột bạch" \
  "Chuột đồng"

> đặt --show DataList

$DataList: được đặt trong phạm vi toàn cầu, chưa được xuất, với 5 phần tử
$DataList[1]: |Cat|
$DataList[2]: |Chó|
$DataList[3]: |Rabbit|
$DataList[4]: |GuineaPig|
$DataList[5]: |Hamster|

> tiếng vang $DataList[2]
Chú chó

Cuối cùng, câu hỏi của bạn, theo nghĩa đen, là tách danh sách thành biến, thay vì một biến chứa danh sách. tôi cho rằng đó không phải là Thực ra Ý của bạn là gì. IMHO sẽ hơi bệnh hoạn, vì bạn sẽ mất khả năng dễ dàng đếm, lặp lại và lập chỉ mục kết quả, nhưng nó có thể được làm ...

đặt Danh sách dữ liệu "
Con mèo
Chú chó
Con thỏ
Chuột bạch
chuột đồng
"

đặt v (tách chuỗi -n \n "$DataList")

đặt scrpt (đối với tôi trong (seq (count $v))
             echo 'đặt giá trị'(math $i-1) '"'$v[$i]'"'
           chấm dứt)

eval (nối chuỗi ";" $scrpt)
đặt --erase v
đặt --erase scrpt

Kết quả trong:

$Value0 = "Mèo"
$Value1 = "Chó"
$Value2 = "Con thỏ"
$Value3 = "GuineaPig"
$Value4 = "Chuột đồng"
MissBrae avatar
lá cờ ca
Cảm ơn! Cái cuối cùng đó chính xác là những gì tôi muốn! Có lẽ lý do của tôi cần phải làm điều này sẽ giải thích tại sao. Tôi đã tạo một tập lệnh shell để hiển thị thông tin hệ thống như kiểu bộ xử lý, số lượng bộ nhớ, kiểu bo mạch hệ thống, cũng như các phiên bản hệ điều hành và nhân. Tôi muốn thêm một cách để hiển thị cấu hình bộ nhớ chính xác chứ không chỉ số lượng, tốc độ và số lượng mô-đun. Ví dụ. Bộ nhớ: 16 GB (8 GB x 2). Tôi đã có một hàm phân tích cú pháp dmidecode và đặt số lượng bộ nhớ là $MemoryCount và số lượng mô-đun là $ModulesInstalled và $TotalModules. Bây giờ tôi có một nơi để bắt đầu.
MissBrae avatar
lá cờ ca
Chà ... có vẻ như nó sẽ làm những gì tôi muốn. Nhưng tôi cứ gặp lỗi khi tôi cố chạy nó. Tôi không rành về các vòng lặp for trong Fish, vì vậy tôi không thể tự gỡ lỗi cho nó: ~/.local/ubin/test.fish (dòng 13): Kết thúc chuỗi không mong muốn, dấu ngoặc kép không cân bằng set scrpt (for i trong (seq (đếm $v)) echo 'đặt giá trị''(math $i-1) '"'$v[$i]'"' chấm dứt) eval (nối chuỗi ";" $scrpt) đặt --erase v scrpt ^ cá: Lỗi khi đọc tệp /home/braelin/.local/ubin/test.fish
NotTheDr01ds avatar
lá cờ vn
@MissBrae À vâng, nếu đó là phân tích cú pháp bản ghi, thì điều đó có ý nghĩa. Nhưng có lẽ tốt hơn là đăng một cái gì đó giống như "dữ liệu thực" mà bạn đang sử dụng. Kịch bản thậm chí có thể đơn giản hơn. Vấn đề với các trích dẫn là lỗi của tôi -- Tôi đã sửa nó. Lưu ý rằng Fish đủ đẹp để làm nổi bật phần trích dẫn bổ sung (ít nhất là dòng) có vấn đề nếu bạn dán nó vào dấu nhắc.
MissBrae avatar
lá cờ ca
Cảm ơn một lần nữa, cho việc sửa chữa! Tôi đã thực hiện chỉnh sửa của riêng mình... có vẻ như lệnh 'set --erase' chỉ mong đợi 1 đối số chứ không nhiều hơn, vì vậy tôi đã tách thành hai dòng. Bây giờ nó hoạt động như mô tả! Tôi sẽ ghi nhớ điều đó, không chỉ đơn giản là câu hỏi. Có lẽ tôi sẽ nhận được phản hồi tốt hơn nếu tôi nói ra vấn đề thực sự của mình. Bây giờ... để bắt đầu công việc thêm vào tập lệnh thu thập thông tin hệ thống của tôi!
NotTheDr01ds avatar
lá cờ vn
@MissBrae Có vẻ như `set --erase` với nhiều giá trị là một phiên bản khá gần đây trong Fish 3.2. Đừng quên chấp nhận câu trả lời - Cảm ơn!
Điểm:0
lá cờ it

Tôi sẽ giữ các giá trị trong danh sách được phân tách bằng dấu hai chấm và sử dụng "Hàm đường dẫn Bash" của Stephen Collyer và cắt -d: -f3 hoặc tương tự.

Đây là đốm màu viết sẵn của tôi:

Tôi sử dụng bash_path_funcs của Stephen Collyer, được mô tả trong Tạp chí Linux từ năm 2000:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://www.linuxjournal.com/article/3935

Các đường dẫn thêm chức năng thêm một mục nhập vào một đường dẫn chỉ khi nó không có ở đó ngay từ đầu. delpath -n xóa tất cả các thư mục không tồn tại khỏi một đường dẫn.

bạn có thể lấy pathfunc.tgz tập tin từ https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.