Динамическое создание и назначение переменных в UNIX - PullRequest
0 голосов
/ 04 июля 2018

Я пытался динамически генерировать переменные и присваивать им значения, но я столкнулся с двумя проблемами с кодом:

  1. Я не могу преобразовать значение "count" в числовое значение, чтобы его можно было использовать в цикле
  2. Значения переменных теряются после завершения цикла for.

код

filename=$1

count= sed -n 1p $1 | tr ',' '\n' | wc -l

while read line

do

    if [ $i -ne 1 ]; then
        check_Keyword=`echo $line |grep -Eo '\b,Error\b'`
        if [ "$check_Keyword" = ",Error" ]; then
            if [ $post_counter -eq 0 ]; then
                post_counter=$(expr $post_counter + 1)
            else
                write_values
            fi
            temp_text=""
                 for j in $(eval echo {1..count} )
                    do
                        Column[$j]=`echo $line | cut -d ',' -f$j`
                    done 

            temp_text=`echo $line | cut -d ',' -f3`
        else
            temp_text=$line

        fi
        msg_identifier=$msg_identifier$temp_text

    fi
i=$(expr $i + 1)
done < $file_name

1 Ответ

0 голосов
/ 04 июля 2018

Чтобы ответить на ваш первый вопрос, вы можете попробовать что-то вроде:

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

Что это нам показывает?

  1. Вы можете прочитать значения массива вне цикла for.
  2. Вы можете прочитать значения массива вне цикла while.
  3. Вы заменяете смещения массива на каждой итерации цикла while.

Тогда вот еще несколько ошибок в вашем скрипте:

  1. Вы можете использовать for j in (( i=1 ; i<= $count ; i++ )) вместо for j in $(eval echo {1..count} ), чтобы избежать использования eval echo (и не забудьте $, чтобы получить значение).
  2. Вы можете использовать (( i++ )) вместо i=$(expr $i + 1).
  3. Вы должны защищать свои переменные, используя двойные кавычки, например: msg_identifier="${msg_identifier}${temp_text}" вместо msg_identifier=$msg_identifier$temp_text, например ( вот пример ошибки, когда вы не защищаете свои переменные).

Вывод:

В вашем скрипте много проблем (среди прочего, присваивание count и чтение count в цикле for), ваши циклы могут не иметь ожидаемого поведения из-за этих синтаксических ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...