【问题标题】:Error when running curl inside script (No such file or directory)在脚本中运行 curl 时出错(没有这样的文件或目录)
【发布时间】:2014-05-09 12:19:39
【问题描述】:

我有以下 .sh 文件,我从网上找到的东西拼凑而成。
目标是读取 CSV 文件中的第 2 行第 2 项,并使用它向 elasticsearch 发送删除命令。

#!/bin/sh
OLDIFS=$IFS
IFS=,


function quit {
        echo "Quitting Script"
        IFS=$OLDIFS
    exit 1
}
function fileExists {
    if [ ! -f "$1" ]
        then
            echo "File $1 does not exists"
                quit
        fi
echo "File Name:  $1"
}
function work {
        linesToSkip=1
        {
            for ((i=$linesToSkip;i--;)) ;do
                read
            done
                #Read 2nd item of the 2nd line of CSV file to get PROGRAMURL
            read INDEX PROGRAMURL JUNK
                echo "$PROGRAMURL"
                QUERY="curl -XDELETE http://127.0.0.1:9200/cj/_query  -d '{ \"query\" : { \"match\" : { \"PROGRAMURL\" : "$PROGRAMURL" } } }'"
                $("$QUERY")
                #RESPONSE=`$QUERY`
                #echo $RESPONSE

        } < $1

}

fileExists $1
work $1
IFS=$OLDIFS

除了执行 curl 脚本外,一切正常。我已经用 $()、backtics、exec 试过了,但我无法让它工作。

以下是我运行 bash -vx script.sh 时的错误:

bash -vx ./deleteExisting.sh catalog.csv
#!/bin/sh
OLDIFS=$IFS
+ OLDIFS='  
'
IFS=,
+ IFS=,


function quit {
    echo "Quitting Script"
    IFS=$OLDIFS
    exit 1
}
function fileExists {
    if [ ! -f "$1" ]
    then
        echo "File $1 does not exists"
        quit
    fi  
echo "File Name:  $1"
}
function work {
    linesToSkip=1
    {
        for ((i=$linesToSkip;i--;)) ;do
            read
        done
        #Read 2nd item of the 2nd line of CSV file to get PROGRAMURL
        read INDEX PROGRAMURL JUNK
        echo "$PROGRAMURL"
        QUERY="curl -XDELETE http://127.0.0.1:9200/cj/_query  -d '{ \"query\" : { \"match\" : { \"PROGRAMURL\" : "$PROGRAMURL" } } }'"
        $("$QUERY")
        #RESPONSE=`$QUERY`
        #echo $RESPONSE

    } < $1  

}

fileExists $1
+ fileExists catalog.csv
+ '[' '!' -f catalog.csv ']'
+ echo 'File Name:  catalog.csv'
File Name:  catalog.csv
work $1
+ work catalog.csv
+ linesToSkip=1
+ (( i=1 ))
+ (( i-- ))
+ read
+ (( 1 ))
+ (( i-- ))
+ read INDEX PROGRAMURL JUNK
+ echo '"http://www.website.com"'
"http://www.website.com"
+ QUERY='curl -XDELETE http://127.0.0.1:9200/cj/_query  -d '\''{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }'\'''
"$QUERY")
"$QUERY"
++ 'curl -XDELETE http://127.0.0.1:9200/cj/_query  -d '\''{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }'\'''
./deleteExisting.sh: line 29: curl -XDELETE http://127.0.0.1:9200/cj/_query  -d '{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }': No such file or directory
IFS=$OLDIFS 
+ IFS='     
'

CSV 文件示例

INDEX, PROGRAMURL, other, info
"1", "http://website.com", "other info", "information"

【问题讨论】:

  • 不要试图用字符串和变量组成命令。使用 函数.
  • 你能详细说明一下吗?
  • @n.m.即使使用函数,在 shell 脚本中的某些时候,也经常需要将东西粘合在一起......这通常可以表明可能是时候考虑另一种语言,例如 python
  • 写一个名为query的函数。将$PROGRAMURL 作为参数传递。
  • 他仍然需要知道如何将随后变为 $1 的内容加入到该函数内的其余参数 -d...

标签: bash curl sh


【解决方案1】:

运行 $("$QUERY") 实际上会尝试在子 shell 中运行一个名为 &lt;the expanded value of $QUERY&gt; 的命令,因此出现 '(bunch of stuff) No such file or directory' 错误。

你可能想要这样的东西:

CURLURL="http://127.0.0.1:9200/cj/_query"
CURLDATA='{ "query" : { "match" : { "PROGRAMURL" : "'$PROGRAMURL'" } } }'
RESPONSE=`curl -XDELETE "$CURLURL"  -d "$DATA"`

这里的技巧是如何嵌套单引号和双引号。简明扼要地解释起来有点困难,但这里是:

  • Shell 变量不在外部单引号内展开。
  • 但您不需要在单引号内转义双引号
  • 所以我们如何让$PROGRAMURL 在上面展开是立即将它连接在一对闭-开单引号之间。
  • 要随后使用变量CURLDATA,它必须在双引号内传递给curl 命令
  • 一个更简单的例子:
VARIABLE1="Hello, world"
VARIABLE2='This is "$verbatim" stuff"'$VARIABLE1'" More stuff'
  • 这会产生$VARIABLE2 的值This is "$verbatim" stuff"Hello, World" More stuff

其他注意事项:

  • 上面会将curl命令的整个stdout放入变量RESPONSE
  • 之后您需要检查 $? 以查看 curl 是否真的设法与主机对话等 - 如果一切正常,它将为 0
  • 您可能希望关闭进度条

跳线:

  • 跳过行的更好方法是使用:
tail -n +$(( $linesToSkip +1 ))

【讨论】:

  • 看起来有效,谢谢您的解释。
  • 我用你所说的更新了脚本,我又遇到了同样的问题,我想我做得对..你介意看一下吗? stackoverflow.com/questions/22759076/…谢谢
  • 优秀的东西 :) 上帝保佑你。
猜你喜欢
  • 2018-03-24
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2016-08-15
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多