mercredi 4 janvier 2017

Newbie: unix bash, nested if statement, results from a loop results from sql

Newbie here, please pardon any confusing wording that I use. A common task I have is to take a list of names and do a MySQL query to look the names up in a table and see if they are "live" on our site.

Doing this one at a time, my SQL query works fine. I then wanted to do the query using a loop from a file listing multiple names. This works fine, too.

I added this query loop to my bash profile so that I can quickly do the task by typing this:

$ ValidOnSite fileName

This works fine, and I even added an usage statement for my process to remind myself of the syntax. Below is what I have that works fine:

validOnSite() {


        if [[ "$1" == "" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
                echo "Usage:"
                echo " $ validOnSite [filename]"
                echo " Where validOnSite uses specified file as variables in sql query:"
                echo " SELECT name, active FROM dbDb WHERE name=lines in file"
        else

                cat $1 | while read line ; do hgsql -h genome-centdb hgcentral -Ne "select name, active from dbDb where name='$line'" ; done

                fi

Using a file "list.txt" which contains:

nameA
nameB

I would then type:

validOnSite list.txt

and both entries in list.txt meet my query criteria and are found in sql. My results will be:

nameA 1
nameB 1

Note the "1" after each result. I assume this is some sort of "yes" status.

Now, I add a third name to my list.txt, one that I know is not a match in sql. Now list.txt contains:

nameA
nameB
foo

When I again run this command for my list with 3 rows:

validOnSite list.txt

My results are the same as when I used the 1st version of file.txt, and I cannot see which lines failed, I still only see which lines were a success:

nameA 1
nameB 1

I have been trying all kinds of things to add a nested if statement, something that says, "If $line is a match, echo "pass", else echo "fail."

I do not want to see a "1" in my results. Using file.txt with 2 matches and 1 non-match, I would like my results to be:

nameA pass
nameB pass
foo fail

Or even better, color code a pass with green and a fail with red.

As I said, newbie here... :)

Any pointers in the right direction would help. Here is my latest sad attempt, but I realize I may be going in a wrong direction entirely:

validOnSite() {


        if [[ "$1" == "" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
                echo "Usage:"
                echo " $ validOnSite [filename]"
                echo " Where validOnSite uses specified file as variables in sql query:"
                echo " SELECT name, active FROM dbDb WHERE name=lines in file"
        else

                cat $1 | while read line ; do hgsql -h genome-centdb hgcentral -Ne "select name, active from dbDb where name='$line'" > /dev/null ; done
 if ( "status") then
      echo $line "failed"
      echo $line "failed" >> outfile
else
     echo $line "ok"
     echo $line "ok" >>outfile
     clear
     cat outfile
     fi
fi

If something looks crazy in my last attempt, it's because it is - I am just googling around and trying as many things as I can while trying to learn. Any help appreciated, I feel stuck after working on this for a long time, but I am excited to move forward and find a solution! I think there is something I'm missing about understanding stdout, and also confusion about nested if's.

Note: I do not need an outfile, but it's ok if one is needed to accomplish the goal. stdout result alone would suffice, and is preferred.

Aucun commentaire:

Enregistrer un commentaire