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?
for a in $col1; do
? Và giống nhau cho b
và c
? Tôi nghĩ rằng khi bạn làm điều đó b
, $col2
trả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.