I have that script that is supposed to read data from two txt files and add them. For that matter I have used array.
I can read the data but there is a problem with the addition.
JavaScript
x
#!/bin/bash
n=1
declare -a data1
while read data1
do
data1[$n]=$data1
n=$(( n+1 ))
done <analysisSBM105.out
echo ${data1[1]}
echo ${data1[2]}
echo ${data1[3]}
echo ${data1[4]}
m=1
declare -a data2
while read data2
do
data2[$m]=$data2
m=$(( m+1 ))
done <analysisSBM105.out
echo ${data2[1]}
echo ${data2[2]}
echo ${data2[3]}
echo ${data2[4]}
i=1
declare -a dataAll
while [ $i -le 4 ];
do
${dataAll[$i]}= $( ${data1[$i]}+${data2[$i]} )
i=$(( i+1 ))
done
echo ${dataAll[1]}
echo ${dataAll[2]}
echo ${dataAll[3]}
echo ${dataAll[4]}
Instead of ${dataAll[$i]}= $( ${data1[$i]}+${data2[$i]} )
, I have also used 'expr ${data1[$i]}+${data2[$i]}'
The analysisSBM105.out file has the following
JavaScript
6436
4167
1933
164
172
But still it doesn’t work. The error is
JavaScript
6436
4167
1933
164
6436
4167
1933
164
Report105.sh: line 35: dataAll[1]: command not found
Report105.sh: line 35: dataAll[2]: command not found
Report105.sh: line 35: dataAll[3]: command not found
Report105.sh: line 35: dataAll[4]: command not found
Desired output is the following.
JavaScript
12872
8334
3866
328
344
Advertisement
Answer
Bash is space aware. Variable assignment has a =
character with no spaces before nor after it.
JavaScript
${dataAll[$i]}= $( ${data1[$i]}+${data2[$i]} )
^^^^^^^^^^^^^^^^^^^^^^^^^ - command to run
^^ ^ - command substitution, runs command inside
^ - space after `=` - it's not assignment
^^^^^^^^^^^^^^^ - runs a command named that after expansion
while I guess you wanted to do:
JavaScript
dataAll[i]=$(( data1[i] + data2[i] ))
^^^^^^^^^^^^^^^^^^^ - expression to calculate, `${..}` is not needed
^^^ ^^ - arithemtic expansion
^ - no spaces around =
^^^^^^^^^^ - variable name
Notes:
declare -a array
is not needed. You can just usedataAll[0]=something
straight away.- it’s easier to write
for ((i=0;i<4;++i))
theni=0;while [ "$i" -le 4 ]; do something; i=$((i+1)); done
. Also you mayfor i in $(seq 4)
- Indent your code properly.
- Use http://shellcheck.net to check your code
- The
array[<here>]
– the<here>
part runs as a arithmetic expression, that means that variables are automatically expanded.dataAll[$i]
is equal todataAll[i]
. The same happens inside$((..))
–$(( ${dataAll[$i]} ))
is equal to$(( dataAll[$i] ))
or just$(( dataAll[i] ))
- Print array on separate newlines with just
printf "%sn" "${dataAll[@]}"
. - You may want to rewrite it in
awk
for speed and efficiency