Điều này đã mất rất nhiều thử nghiệm và sai sót nhưng cuối cùng đã làm việc.
Tôi lấy một số cảm hứng từ Youness. Nhưng tất cả các câu trả lời khác không giúp ích gì cho bash cũ của tôi (suse11sp1 [3.2.51 (1) -release])
Vòng lặp 'for' đã từ chối mở rộng mảng gián tiếp, thay vào đó bạn cần mở rộng trước nó, sử dụng nó để tạo một mảng khác với tên biến mới của bạn. Ví dụ của tôi dưới đây cho thấy một vòng lặp kép, vì đó là mục đích sử dụng của tôi.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
Tôi đang sử dụng # để xóa "New_" khỏi mục nhập mảng đầu tiên, sau đó ghép nối với "thứ", để có được "FOOthings". \ $ {} với echo và eval, sau đó thực hiện theo thứ tự mà không đưa ra các lỗi, được gói trong một $ () mới và gán tên biến mới.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
CẬP NHẬT ##### 2018/06/07
Gần đây tôi đã phát hiện thêm một spin về vấn đề này. Biến được tạo không thực sự là một mảng, mà là một chuỗi được phân tách bằng dấu cách. Đối với tác vụ trên, điều này là ổn, vì cách "cho" hoạt động, nó không đọc được mảng, nó được mở rộng và sau đó lặp lại, xem trích xuất bên dưới:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Nhưng, sau đó tôi cần sử dụng nó như một mảng. Đối với điều này, tôi cần phải thực hiện một bước nữa. Tôi lấy mã nguyên văn của Dennis Williamson . Tôi đã thử nó và nó hoạt động tốt.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" là một biến chứa dấu phân cách của bạn. "Đọc" với "-a" cắt và đưa sting trở lại vào biến mảng. Lưu ý, điều này không liên quan đến dấu ngoặc kép, nhưng có một vài tùy chọn được đọc để quản lý điều này, ví dụ tôi đã xóa cờ -r mà tôi không cần. Vì vậy, bây giờ tôi đã kết hợp bổ sung này trong việc tạo biến, cho phép dữ liệu được xử lý và xử lý như bình thường.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done