在UNIX中动态创建和分配变量

时间:2018-07-04 19:35:39

标签: bash shell unix

我尝试动态生成变量并为其分配值,但是我在代码中遇到了两个问题:

  1. 我无法将“ count”的值转换为数值,因此可以在for循环中使用
  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 :(得分:1)

要回答第一个问题,您可以尝试以下操作:

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(当您不保护变量时,here's an example就是错误)。

结论:

您的脚本中有很多问题(除了count循环中的count赋值和for读取之外),由于这些语法错误,您的循环可能没有预期的行为