Looking2learned
Looking2learned

Reputation: 213

Trying to create a file to call another file for a looped search

I'm attempting to write a script that calls another script and uses it either once, or in a loop, depending on the inputs.

I wrote a script that simply searches a file for a pattern and then prints the file name and lists the lines that the search was found on. That script is here

#!/bin/bash

if [[ $# < 2 ]]
then
  echo "error: must provide 2 arguments."
  exit -1
fi

if [[ -e $2 ]]
then
    echo "error: second argument must be a file."
    exit -2
fi

echo "------ File =" $2 "------"
grep -ne $1 $2

So now I want to write a new script that will call this is the user enters just one file as a second argument, and will also loop and search all the files in the directory if they select a directory.

So if the input is:

./searchscript if testfile

it'll just use the script but if the input is:

./searchscript if Desktop

It'll search all the files in a loop.

My heart runnith over for you all, as always.

Upvotes: 3

Views: 65

Answers (4)

Olivier Dulac
Olivier Dulac

Reputation: 3791

er... maybe too simple, but what about letting "grep" do all the work?

#myscript
if [ $# -lt 2 ]
then
  echo "error: must provide 2 arguments."
  exit -1
fi

if [ -e "$2" ]
then
    echo "error: second argument must be a file."
    exit -2
fi
echo "------ File =" $2 "------"
grep -rne "$1" "$2"  

I just added "-r" to the grep invocation : if it's a file, no recursion, if it's a dir, it'll recurse on it.

You could even get rid of the argument checks and let grep barf the appropriate error messages : (keep the quotes or this will fail)

#myscript
grep -rne "$1" "$2"  

Upvotes: 1

nullByteMe
nullByteMe

Reputation: 6391

How about this:

#!/bin/bash

dirSearch() {
   for file in $(find $2 -type f) 
   do 
      ./searchscript $file
   done
}

if [ -d $2 ]
then
    dirSearch
elif [ -e $2 ]
then
    ./searchscript $2
fi

Alternatively if you don't want to parse the output of find you can do the following:

#!/bin/bash

if [ -d $2 ]
then
   find $2 -type f -exec ./searchscript {} \;
elif [ -e $2 ]
then
   ./searchscript $2
fi

Upvotes: 1

kobame
kobame

Reputation: 5856

something like could works:

#!/bin/bash

do_for_file() {
    grep "$1" "$2"
}

do_for_dir() {
    cd "$2" || exit 1
    for file in *
    do
        do_for "$1" "$file"
    done
    cd ..
}

do_for() {
    where="file"
    [[ -d "$2" ]] && where=dir
    do_for_$where "$1" "$2"
}

do_for "$1" "$2"

Upvotes: 1

DVK
DVK

Reputation: 129481

Assuming you do not want to search recursively:

#!/bin/bash

location=shift

if [[ -d $location ]]
then
   for file in $location/*
   do
       your_script $file
   done
else 
   # Insert a check for whether $location is a real file and exists, if needed
   your_script $location 
fi

NOTE1: This has a subtle bug: if some files in the directory start with a ".", as far as i recall, "for *" loop will NOT see them, so you need to add "in $location/* $location/.*" instead

NOTE2: If you want recursive search, instead use find:

in `find $location`

Upvotes: 0

Related Questions