Brad
Brad

Reputation: 2237

bash script not running properly

When I run this by its self in the command line it seems to work fine, but when I have another script execute this, it doesn't work. Any ideas? I'm guessing it has to do with quotes, but not sure.

#!/bin/sh
#Required csvquote from https://github.com/dbro/csvquote
#TODO:  Clean CSV File using CSVFix
#Version 3
echo "File Name: $1"
function quit {
    echo "Quitting Script"
    exit 1
}
function fileExists {
    if [ ! -f "$1" ]
        then
            echo "File $1 does not exists"
            quit
        fi
}
function getInfo {
    #Returns website url like:   "http://www.website.com/info"
    #Reads last line of a csv file, and gets the 2nd item.
    RETURN=$(tail -n 1 $1 | csvquote | cut -d ',' -f 2 | csvquote -u)
    echo $RETURN 
}
function work {
    CURLURL="http://127.0.0.1:9200/cj/_query"
    URL=$(getInfo)
    echo "URL: $URL"
    CURLDATA='{ "query" : { "match" : { "PROGRAMURL" : '$URL' } } }'
    #URL shows up as blank...???
    echo "Curl Data: $CURLDATA"
    RESPONSE=$(curl -XDELETE "$CURLURL"  -d "$CURLDATA" -vn)
    echo $RESPONSE
    echo "Sleeping Allowing Time To Delete"
    sleep 5s
} 

fileExists $1
work $1

Upvotes: 0

Views: 361

Answers (1)

6EQUJ5
6EQUJ5

Reputation: 3302

I cant see why a simpler version wont work: functions are useful, but I think there are too many, overcomplicating things, if what you are posting is the entirety of your script (in my opinion)

Your script is doing things using a broken lucky pattern: $1 variables are also arguments to shell functions as well as the main script. Think of them as local variables to a function. So when you are calling $(getInfo) it is calling that function with no argument, so actually runs tail -n 1 which falls back to stdin, which you are specifying to work as < $1. You could see this for yourself by putting echo getInfo_arg_1="$1" >&2 inside the function...

Note also you are not quoting $1 anywhere, this script is not whitespace in file safe, although this is only more likely to be a problem if you are having to deal with files sent to you from a Windows computer.

In the absence of other information, the following 'should' work:

#!/bin/bash

test -z "$1" && { echo "Please specify a file." ; exit 1; }
test -f "$1" || { echo "Cant see file '$1'." ; exit 1; }

FILE="$1"

function getInfo() {
    #Returns website url like:   "http://www.website.com/info"
    #Reads last line of a csv file, and gets the 2nd item.
    tail -n 1 "$1" | csvquote | cut -d ',' -f 2 | csvquote -u
}


CURLURL="http://127.0.0.1:9200/cj/_query"
URL=$(getInfo "$FILE")
echo "URL: $URL"
CURLDATA='{ "query" : { "match" : { "PROGRAMURL" : '$URL' } } }'
curl -XDELETE "$CURLURL"  -d "$CURLDATA" -vn
echo "Sleeping Allowing Time To Delete"
sleep 5s

If it still fails you really need to post your error messages.

One other thing, especially if you are calling this from another script, chmod +x the script so you can run it without having to invoke it with bash directly. If you want to turn on debugging then put set -x near the start somewhere.

Upvotes: 1

Related Questions