Làm thế nào để chuyển sang mảng kiểu bash thành tro?


12

Cách đây một thời gian, tôi đã viết một tập lệnh bash mà bây giờ có thể chạy trong môi trường ash.

Trong bashđó giống như:

services=( "service1.service"
           "service2.service"                                       
           "service3.service" )  

for service in "${services[@]}"
do
   START $service                   
done

START()
{
   echo "Starting "$1
   systemctl start $1
}

Trong thực tế, có khoảng 40 dịch vụ trong mảng và tôi muốn thực hiện quá trình chuyển đổi này không gây đau đớn và sạch sẽ nhất có thể. Luôn luôn được sử dụng bashisms. Bây giờ tôi đang ở trong tình trạng khó khăn với nhiệm vụ làm cho các kịch bản dễ mang theo hơn.

Vì lý do tính di động, có lẽ sẽ rất tốt nếu có một ashgiải pháp thuần túy . Nhưng vì tôi có một khả năng khá mạnh mẽ busyboxnên tôi có thể hy sinh một số tính di động. Chỉ khi khả năng đọc cải thiện rất nhiều, vì tập lệnh "sạch" cũng là một số liệu.

Điều gì sẽ là giải pháp di độngsạch trong trường hợp này?

Câu trả lời:


8

Trước khi mảng đã ở bash, kshvà vỏ khác, phương pháp thông thường là để chọn một delimiter mà không phải là trong bất kỳ các yếu tố (hoặc một trong đó là không phổ biến để giảm thiểu bất kỳ yêu cầu thoát), và lặp qua một chuỗi chứa tất cả các yếu tố, ngăn cách bởi dấu phân cách đó Khoảng trắng thường là lựa chọn dấu phân cách thuận tiện nhất vì shell đã phân tách "từ" theo khoảng trắng theo mặc định (bạn có thể đặt IFS nếu bạn muốn phân tách thành thứ gì đó khác).

Ví dụ:

# backslash-escape any non-delimiter whitespace and all other characters that
# have special meaning to the shell, e.g. globs, parenthesis, ampersands, etc.
services='service1.service service2.service service3.service'

for s in $services ; do  # NOTE: do not double-quote $services here.
  START "$s"
done

$servicesKHÔNG nên được trích dẫn ở đây vì chúng tôi muốn shell chia nó thành "từ".


3

tro không có mảng. Điều duy nhất đến gần là các tham số vị trí, vì vậy bạn có thể làm

set -- "service1.service" \
       "service2.service" \
       "service3.service"

for service in "$@"
do
   START $service
done

3

Nếu bạn chỉ cần tham khảo danh sách dịch vụ một lần, bạn có thể sử dụng tài liệu tại đây:

while IFS= read -r service
do
   START "$service"
done << END
service1.service
service2.service
service3.service
END

Lưu ý rằng tên dịch vụ không nên được trích dẫn trong danh sách (mặc dù "$service"có lẽ nên được trích dẫn, trừ khi bạn có lý do chính đáng để không). Nếu bạn muốn thụt tên dịch vụ, hãy sử dụng <<-thay vì <<và thụt tên với các tab:

while IFS= read -r service
do
   START "$service"
done <<- END
        service1.service
        service2.service
        service3.service
END
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.