Чтобы ответить на ваш первый вопрос, вы можете попробовать что-то вроде:
count=$(sed -n 1p $1 | tr ',' '\n' | wc -l)
Или:
count=`sed -n 1p $1 | tr ',' '\n' | wc -l`
=> Вам нужно использовать подоболочку для перехвата вывода и не ставить пробел вокруг =
.
Чтобы ответить на ваш второй вопрос о получении значений массива вне циклов, давайте проведем этот эксперимент:
$ cat data.txt
line1
line2
line3
$ while read; do for i in {1..10}; do array[$i]="$REPLY"; done; done < data.txt
$ echo ${#array[@]}
10
$ echo ${array[@]}
line3 line3 line3 line3 line3 line3 line3 line3 line3 line3
$ while read; do for i in {1..10}; do array[$i]="$REPLY"; done; echo "size=${#array[@]}, content=${array[@]}"; done < data.txt
size=10, content=line1 line1 line1 line1 line1 line1 line1 line1 line1 line1
size=10, content=line2 line2 line2 line2 line2 line2 line2 line2 line2 line2
size=10, content=line3 line3 line3 line3 line3 line3 line3 line3 line3 line3
Что это нам показывает?
- Вы можете прочитать значения массива вне цикла
for
.
- Вы можете прочитать значения массива вне цикла
while
.
- Вы заменяете смещения массива на каждой итерации цикла
while
.
Тогда вот еще несколько ошибок в вашем скрипте:
- Вы можете использовать
for j in (( i=1 ; i<= $count ; i++ ))
вместо for j in $(eval echo {1..count} )
, чтобы избежать использования eval echo
(и не забудьте $
, чтобы получить значение).
- Вы можете использовать
(( i++ ))
вместо i=$(expr $i + 1)
.
- Вы должны защищать свои переменные, используя двойные кавычки, например:
msg_identifier="${msg_identifier}${temp_text}"
вместо msg_identifier=$msg_identifier$temp_text
, например ( вот пример ошибки, когда вы не защищаете свои переменные).
Вывод:
В вашем скрипте много проблем (среди прочего, присваивание count
и чтение count
в цикле for
), ваши циклы могут не иметь ожидаемого поведения из-за этих синтаксических ошибок.