for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber
let i=0
while IFS=$'\n' read -r line_data; do
eval CAT$cnumber[i]='"${line_data}"'
((++i))
done < input_file_$cnumber
done
Главным образом, это добавляет слово «eval», которое заставляет bash оценивать остальную часть линии. До этого bash расширяет переменные, поэтому число CAT $ будет чем-то вроде CAT1 при вычислении строки. Имейте в виду, что «$ {line_date}» будет подвержен переменному расширению до того, как eval оценит линию, если она не будет защищена одинарными кавычками. Это может иметь неожиданные последствия, если $ line_data будет содержать пробелы. Смотрите этот упрощенный пример:
a=b
l="hello date"
eval $a="$l" # executes "date", has no other effect
echo $b # prints an empty line
eval $a='"$l"' # sets b to "hello date"
echo $b # prints that: hello date
В ответ на комментарий Этан Рейснер ниже, я добавляю другое решение, которое избегает «Eval» и вместо этого использует ссылки, которые доступны в Баш версии 4.3 или выше. В этом случае, используя ссылки предпочтительнее по той причине, Этан указал, а также, на мой взгляд, потому что это более естественно:
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber # be sure the array is declared before ...
declare -n ref=CAT$cnumber # ... you declare ref to reference the array
let i=0
while IFS=$'\n' read -r line_data; do
ref[$i]="${line_data}"
((++i))
done < input_file_$cnumber
done
Попробуйте Concat на номер CAT {т.е. $} номер C. Дайте мне знать, если он работает – Jigar
Я думаю, вы имеете в виду 'CAT $ {cnumber}' – Jasen