Oliver.Fryer
Oliver.Fryer

Reputation: 5

Using a FOR loop to compare items in a list with items in an ARRAY

Without too much fluff, basically I'm creating an array of IP addresses from a user provided file. Then I have another file with three columns of data and multiple lines, the first column is IP addresses.

What I'm trying to do is loop through the file with 3 columns of data and compare the IP addresses with the values in the arrary, and if a value is present from file in the array, to then print some text as well as the 3rd column from that line of the file.

I have a feeling I'm taking a really wrong approach and making things a lot harder than what they need to be!

Semi-Pseudo code below

#!/bin/bash 

scopeFile=$1 
data=$2

scopeArray=()
while IFS= read -r line; do
scopeArray+=("$line")
done <$1

for line in $2; do 
  if [[ $line == scopeArray ]]; then 

  awk '{print $3 " is in scope!"}' $2; 

  else 

    echo "$line is NOT in scope!" 

  fi;
done 

EDIT: Added example files for visulisation for context, data.txt file is dynamically generated elsewhere but the format is always the same.

scope.txt=$1 
192.168.0.14
192.168.0.15
192.168.0.16
data.txt=$2 
192.168.0.14 : example.com
192.168.0.15 : foobar.com
192.168.0.19 : test.com 

Upvotes: 0

Views: 144

Answers (1)

Jetchisel
Jetchisel

Reputation: 7791

Here is one way of doing what you wanted.

#!/usr/bin/env bash

mapfile -t scopeArray < "$1"

while read -r col1 col2 col3; do
  for item in "${!scopeArray[@]}"; do
    if [[ $col1 == "${scopeArray[item]}" ]]; then
      printf '%s is in scope!\n' "$col3"
      unset 'scopeArray[item]' && break
    else
      printf '%s is not is scope!\n' "$col1" >&2
    fi
  done 
done < "$2"
  • The shell is not the best if not the right tool for comparing files, but it will get you there slowly but surely.

  • mapfile is a bash4+ feature jyfi.

Upvotes: 1

Related Questions