Bash script - vấn đề danh sách kiểm tra hộp thoại


0

Tôi đang cố gắng viết một tập lệnh bash để tự động cài đặt các gói của tôi. Vì vậy, ý tưởng là đọc một tệp .csv (gói.csv) như thế này:

pkg,Description,option
wget,file downloader,on
curl,tool to transfer data from or to a server,on
nano,text editor for Unix-like computing systems,off
emacs,An extensible customizable free/libre text editor  and more,on

xây dựng một mảng cho mỗi cột (không có tiêu đề) và sau đó chuyển các mảng vào danh sách kiểm tra hộp thoại.

#!/bin/bash

input="packages.csv"
while IFS=',' read -r col1 col2 col3
do 
    for a in $col1; do
        array_col1+=("$a") 
    done

    for b in $col2; do
        array_col2+=("$b")
    done

    for c in $col3; do
        array_col3+=("$c")
    done        

done < "$input"

array1=("${array_col1[@]:1}")
array2=("${array_col2[@]:1}")
array3=("${array_col3[@]:1}")

let num=${#array2[*]}-1

for i in $(seq 0 $num); do
    list[i]=$(echo ${array1[i]} ${array2[i]} ${array3[i]})
done

OPTION=$(dialog --checklist "Choose packages:" \
10 60 4 \
${list[*]})
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "$OPTION"
else
    echo "Cancel"
fi

Tôi đã làm cho nó hoạt động tại một số điểm nhưng không có bất kỳ khoảng trống trong mô tả. Sau khi tôi thực hiện một số thay đổi để bao gồm các không gian, nó hoàn toàn không hoạt động. Làm thế nào tôi có thể sửa chữa nó? Thực tế trong tệp .csv của tôi có hơn 3 cột nhưng danh sách kiểm tra bash mong đợi 3 đối số. Có thể bằng cách nào đó bao gồm chúng trong danh sách kiểm tra?


Bạn đã xem xét sử dụng một cái gì đó như con rối thay thế? Liên kết có một ví dụ về trường hợp sử dụng chính xác của bạn.
hhoke1

Không, con rối dường như là một quá mức cho trường hợp đơn giản này.
dương

Để làm gì for a in $col1; do? Và giống nhau cho bc? Tôi nghĩ rằng khi bạn làm điều đó b, $col2trải qua quá trình phân tách từ với tiêu chuẩn IFS; sau đó bạn nhận được nhiều b-s trong khi vẫn phân tích một dòng.
Kamil Maciorowski

@Kamil Maciorowski: Điền vào 3 mảng
coverflower

Tôi đã tìm thấy cái này ở đây: stackoverflow.com/questions/30146241/ trên đó hoạt động. Đối số giữa nằm trong dấu ngoặc đơn và đối số trái và phải thì không. Đây phải là vấn đề nhưng tôi không biết cách khắc phục ...
coverflower

Câu trả lời:


1
#!/bin/bash

input="packages.csv"
while IFS=',' read -r col1 col2 col3 dummy
do
   array+=("$col1")
   array+=("$col2")
   array+=("$col3")
done < <(tail -n +2 "$input")

option=$(dialog --checklist --output-fd 1 "Choose packages:" 10 60 4 "${array[@]}")

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "$option"
else
    echo "Cancel"
fi

Những thay đổi chính:

  • tail -n +2 "$input" để tước tiêu đề;
  • dummybiến để cho phép nhiều hơn ba cột (cột thêm không quan trọng dialog);
  • một arraybiến để xây dựng đầu vào dialogthay vì nhiều biến truyền dữ liệu theo cách bị tê liệt;
  • "${array[@]}" như một cách thích hợp để truyền mảng dưới dạng đối số dòng lệnh trong trường hợp này;
  • --output-fd 1giải thích trong câu trả lời này (có những giải pháp tốt hơn, mạnh mẽ hơn ở đó);
  • biến chữ thường cho câu trả lời này .

Trên thực tế trong .csvtệp của tôi, tôi có nhiều hơn 3 cột nhưng danh sách kiểm tra bash mong đợi 3 đối số. Có thể bằng cách nào đó bao gồm chúng trong danh sách kiểm tra?

Để làm gì? Đúng, dialog --checklistmong họ ba bằng ba. Giữ nó gọn gàng. Tôi đoán có lẽ bạn cần nhiều cột hơn cho mã của bạn sau đó dialog . Xem xét điều này: khi dialogtrả về thành công số nhận dạng từ cột đầu tiên và bạn có chúng vào $option, phân tích đầu ra của nó như thế này:

for package in $option; do  ; done

(Để làm việc này, cột đầu tiên của bạn packages.csvkhông thể chứa dấu cách, v.v.)

Bằng cách này bạn có thể làm một cái gì đó cho mỗi gói được chọn. Trong vòng lặp này, bạn có thể đọc bao nhiêu cột mà bạn cần một lần nữa, nhưng trước tiên grepcho dòng thích hợp:

IFS=',' read -r col1 col2 col3 col4 col5 col6 dummy < <(grep "^${package}," "$input")

(Gợi ý: điều tra read -a, xem help read). Và sau đó, vẫn trong vòng lặp, làm phần còn lại của công việc của bạn.

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.