我尝试动态生成变量并为其分配值,但是我在代码中遇到了两个问题:
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
答案 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
这向我们展示了什么?
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
(当您不保护变量时,here's an example就是错误)。结论:
您的脚本中有很多问题(除了count
循环中的count
赋值和for
读取之外),由于这些语法错误,您的循环可能没有预期的行为