Chuyển từ một chuỗi sang một mảng các từ ngữ của Viking trong Bash


11

Tôi cần phải đi từ một chuỗi đến một mảng trong đó mỗi mục là mỗi từ trên chuỗi đó. Ví dụ: bắt đầu bằng:

VotePedro="Vote for Pedro"

Tôi cần mảng:

Vote
For
Pedro

Mà sau đó tôi có thể lặp lại như sau:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done

Câu trả lời:


11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

Bạn có thể giải thích những gì dấu ngoặc đơn và dấu ngoặc làm gì? Tôi mới sử dụng BASH và muốn hiểu lý do tại sao điều này sẽ hoạt động.
farid99

1
Mảng thường được khai báo bằng dấu ngoặc đơn. Ví dụ votePedroArray=("Vote" "For" "Pedro")sẽ cung cấp cho bạn một mảng có độ dài 3. Và ${VotePedro}giống như $VotePedrotrong bối cảnh này. Để truy cập các thành phần mảng riêng lẻ, bạn có thể sử dụng dấu ngoặc tương tự như những gì bạn đã có cho vòng lặp for trong câu hỏi của mình. ví dụ: ${votePedroArray[0]}phần tử đầu tiên trong mảng ("Bình chọn" cho ví dụ này)
airfishey

Cảm ơn câu trả lời của bạn. Tôi sẽ nâng cao nhưng tôi chưa có đủ danh tiếng.
farid99

2
Và để lặp lại chúng: bỏ phiếu bằng $ {votePedroArray [@]}; làm vang $ bầu chọn; xong
Neil McGill

4

Khi bạn để lại một mở rộng biến không được trích dẫn, ví dụ $VotePedro, các bước sau đây được thực hiện:

  1. Tra cứu giá trị của biến.
  2. Chia giá trị tại mỗi khối khoảng trắng thành một danh sách các chuỗi. Tổng quát hơn, các dấu phân cách là các ký tự trong giá trị của IFSbiến; theo mặc định đó là không gian, tab và dòng mới.
  3. Giải thích từng yếu tố của danh sách dưới dạng mẫu ký tự đại diện; đối với mỗi phần tử, nếu mẫu khớp với một số tệp, thì thay thế phần tử đó bằng danh sách tên tệp phù hợp.

Do đó, bạn có thể chia một chuỗi thành các phần tử được phân tách bằng khoảng trắng (giả sử giá trị mặc định là IFS) bằng cách tắt mở rộng ký tự đại diện và mở rộng một biến có giá trị đó là chuỗi bên ngoài dấu ngoặc kép.

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do 

Bạn có thể trực tiếp thực hiện việc phân chia tại điểm sử dụng; điều này sẽ hoạt động ngay cả trong các shell như sh không có mảng:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f

0

Bên cạnh việc phá vỡ nó $IFS, bạn cũng có thể phá vỡ nó trên bất cứ thứ gì bạn thích:

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

... sẽ cho phép các trường null được phân tách bằng khoảng trắng, thậm chí.

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.