bash脚本运行不正常

时间:2014-03-31 10:21:01

标签: bash

当我在命令行中通过它自己运行它时它似乎工作正常,但当我有另一个脚本执行它时,它不起作用。有任何想法吗?我猜测它与引号有关,但不确定。

#!/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

1 个答案:

答案 0 :(得分:1)

我不明白为什么一个更简单的版本不会起作用:函数是有用的,但我认为有太多,过于复杂的事情,如果你发布的是你的整个脚本(在我看来)

你的脚本使用破碎的幸运模式做事:$1变量也是shell函数和主脚本的参数。将它们视为函数的局部变量。因此,当您调用$(getInfo)时,它正在调用没有参数的函数,因此实际运行tail -n 1,后退到stdin,您将work指定为< $1。您可以通过将echo getInfo_arg_1="$1" >&2放在函数中来自己看到...

另请注意,您没有在任何地方引用$1,此脚本在文件安全方面不是空格,但如果您不得不处理从Windows计算机发送给您的文件,则更有可能出现此问题

在没有其他信息的情况下,以下情况应该是&#39;工作:

#!/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

如果仍然失败,您确实需要发布错误消息。

另一件事,特别是如果你从另一个脚本调用它,chmod +x脚本,这样你就可以运行它,而不必直接用bash调用它。如果你想打开调试,那么把set -x放在某处的起点附近。

相关问题