Bash script to diff two arrays


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash script to diff two arrays
# 1  
Old 02-08-2016
Bash script to diff two arrays

Hi,

I am quite scripting illiterate and have been trying to write a bash script to compare to two files which i have populated in two seperate arrays as below and confirmed that all the files are loaded into the array.

Code:
IFS=$'\n'
filea=($(find /var/tmp/dir1 -type f -follow -print))
fileb=($(find /var/tmp/dir2 -type f -follow -print))
unset IFS

both directories and files are the same, I want to run a loop over both arrays and then i then want to run the following command and put the output into a variable
Code:
diff -a --suppress-common-lines -y $filea $fileb

is this how i should be setting the variable or should i be doing something different?
Code:
diffout=($(diff -a --suppress-common-lines -y $filea $fileb))

i would then run an IF statement to check if the variable is empty
Code:
if [-n "$diffout" ];then
yes | cp -f $filea /var/tmp/dir3

my overall script so far

Code:
IFS=$'\n'		
			filea=($(find /var/tmp/dir1 -type f -follow -print))
			fileb=($(find /var/tmp/dir2 -type f -follow -print))
		unset IFS
		
		for afile in "{$filea[@]}"
		do
		for bfile in "{$fileb[@]}"
		do
		diffout=($(diff -a --suppress-common-lines -y $filea $fileb))
				
		done
		
		if [-n "$diffout" ];then
			yes | cp -f $filea /var/tmp/destination	
		
		done

# 2  
Old 02-08-2016
There are a few errors, some syntax:
  • $filea instead of correct "$afile" (the name is wrong, but also the quoting is essential)
  • {$ instead of ${
  • if, but no closing then
  • [-n instead of [ -n (the sspppace must be there
  • diffout=(... creates and array, yet you test for "$diffout" a plain variable..
  • What is with the yes piping in to cp -f (which is force mode in itself)
# 3  
Old 02-08-2016
am i any closer?

apologies i am really still learning how to do scripting in general

Code:
        IFS=$'\n'        
            filea=($(find /var/tmp/dir1 -type f -follow -print))
            fileb=($(find /var/tmp/dir2 -type f -follow -print))
        unset IFS
        
        for afile in "${filea[@]}"

        do

        for bfile in "${fileb[@]}"

        do
            diffout=($(diff -a --suppress-common-lines -y "$afile" "$bfile"))
                
        
        if [ ${#diffout[@]} -eq 0 ]; then

        fi
        
        else
            cp -f $afile /var/tmp/destination
        fi
        
        done

# 4  
Old 02-08-2016
Still some syntax:
- two fis for one ifonly
- one done only for two dos

Some semantics:
- no statements in the then branch

Some logics:
- the entire script fails if there's a single file disturbing the sequence of files in either directory
- Unless needed elsewhere, the diffout array doesn't make sense. Try if diff ...
# 5  
Old 02-08-2016
Code:
        IFS=$'\n'        
            filea=($(find /var/tmp/dir1 -type f -follow -print))
            fileb=($(find /var/tmp/dir2 -type f -follow -print))
        unset IFS
        
        for afile in "${filea[@]}"

        do

        for bfile in "${fileb[@]}"

        do
            diffout=($(diff -a --suppress-common-lines -y "$afile" "$bfile"))
                
        
        if [ ${#diffout[@]} -eq 0 ]; then

        echo "No Difference in Configuration Detected"

        fi
        
        else
            cp -f $afile /var/tmp/destination
        
        done
        done

Basically what im looking for differences in configuration files and this would just be text, i was hoping with the
Code:
diffout

to check if it was empty or not, if empty then goto the next file otherwise copy
Code:
$filea

to the specified directory, once copied goto the next file.

apologies if i am just not getting it but like i said i know just the basics of scripting and still yet to learn proper logic etc
# 6  
Old 02-08-2016
Not sure what you want to test - files to be empty or the difference between two of them to disappear?

The residual fi needs to include the else (come after it).
# 7  
Old 02-08-2016
Some plain demo syntax:
Code:
num=2
val=1
another_value=3

# Since we KNOW for 100% its all numbers, no quotes are required around those variables
# If there is the SLIGHTEST chance (parsing an unkown file for example) ALL the variables containing content of those unkown file/lines should be quoted!

if [ $num -eq $val ]
then
	echo "I'm a 'If condition'"
elif [ $num -eq $another_value ]
then
	echo "I'm in 'elif condition'"
else
	echo "I'm in 'else statement'"
fi

for ITEM in *;do
	echo "Found $ITEM in $PWD"
done

Example output from within my tempdir:
Code:
0 ~/tmp/build $ bash ../jlykke

I'm in 'else statement'
Found "kernel" in /home/sea/tmp/build

Hope this helps
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Using Diff to compare 2 arrays

I have two arrays and they look like this: array=(`cat /local/mnt/*sys/*includes|grep -v NEW`) array2=(`cat /tmp/*sys.z |grep -v NEW`) I am trying to compare them but I need to use the diff -u command. I am not sure how to do this. I cannot just do diff -u ${array} ${array2} I cannot... (4 Replies)
Discussion started by: newbie2010
4 Replies

2. Shell Programming and Scripting

Using arrays in bash using strings to bash built-in true

I have the following code and for some reason when I call the program using /home/tcdata/tatsh/trunk/hstmy/bin/bash/raytrac.bash --cmod=jcdint.cmod I get hasArgument = hasArgument = true Somehow the array element is returning even though I have not chosen the option. ... (41 Replies)
Discussion started by: kristinu
41 Replies

3. Shell Programming and Scripting

bc,getopt and arrays in bash

trying to sum elements in an array using bc and getopt,i have a file with names and thier vaules if the names appears 3 times i should multiply its value with 3 then find the sum of all the elements together cat foo.txt max 2.3 henry 3 fransis 4.5 max 2.3 henry 3 max 2.3 it should... (1 Reply)
Discussion started by: elginmulizwa
1 Replies

4. Shell Programming and Scripting

Yet another bash arrays question

Hi all, I have a file that contains many lines, but only a few are of my interest, so I'm cutting it with grep + awk, and the result I get is for example line 0 line 1 line 2 line 3 line n Now I want to store each line in an array "cell" so I can use it later calling to ${array},... (2 Replies)
Discussion started by: TuxSax
2 Replies

5. Shell Programming and Scripting

subtraction in bash arrays

hi i am using bash shell to perform some subraction. here is what i have: i have a while loop and am using i as a counter. diff= `expr ${ARRAY1} - ${ARRAY2}` for example array1 has -0.7145 and array2 has -0.7041. when i try the above command, i get expr: non-numeric argument. any... (6 Replies)
Discussion started by: npatwardhan
6 Replies

6. Shell Programming and Scripting

arrays and while loops in bash

hi guys, i have an array called ARRAY which has elements in it... i am trying to assign elements of ARRAY to master_array.. i get a =: command not found error.. i=0 while do ${master_array}=${ARRAY} ((i++)) done is there something i am missing? (4 Replies)
Discussion started by: npatwardhan
4 Replies

7. Shell Programming and Scripting

arrays in bash

hi guys, i have the following script and when i run it i get blank lines on the screen.. i am trying to display the contents of array var.. #!/usr/bin/bash var=`awk 'NR>20&&NR<31' try.sum | awk '{print $4}'` echo "${var}" (1 Reply)
Discussion started by: npatwardhan
1 Replies

8. Shell Programming and Scripting

Searching Bash Arrays

Hi, I am writing a bash shell script. I would like to execute a statement only if an array contains a specific value. For example: array=(1 3 5 7) I would like to execute the statement only if the value 3 is present in ${array}. Thanks for any help, Mike (1 Reply)
Discussion started by: msb65
1 Replies

9. Shell Programming and Scripting

Arrays in bash.need help

:confused: Is it possible to delete array elements dynamically.For instance,consider an array( a b c d ) ,now can i delete array (the third element 'c').So that the array becomes array(a b d).. Thanks in advance!! (1 Reply)
Discussion started by: tj23
1 Replies

10. UNIX for Dummies Questions & Answers

bash: setting arrays

Ok, I searched the threads a couple of times but couldn't find anything really relevant. Here's my problem, maybe you can help: I am running version 1.14.7 of the bash shell, on Red Hat Linux. I am trying to set an array like so: bash$> letters=(x y z) spaces are between the letters but... (3 Replies)
Discussion started by: Kriton
3 Replies
Login or Register to Ask a Question