curl命令无法在Shell脚本中运行,但在站点外正常运行

时间:2018-10-18 11:33:44

标签: bash shell curl sh

我正在努力处理一个小的bash shell脚本,该脚本应列出我的csv文件并使用curl将它们上传到外部服务。 当我将命令变量回显到控制台并执行它时,我可以正常工作, 但是当我在脚本中执行它时,它会抱怨额外的qouta“

我的脚本看起来像这样

#!/usr/bin/bash
LOGDIR="/var/log/tyk/"
FILE_EXSTENSION_NAME="*.csv"
CURLCMD="curl -k -i -H"
PORT="9992"
ENDPOINT="/endpoint"
URL="https://localhost"



for i in `ls $LOGDIR$FILE_EXSTENSION_NAME`; do
    filename=`echo $i | awk -F "/" ' { print $5 }'`
    echo $filename
    CMD="$CURLCMD \"filename: $filename\" -F \"data=@$LOGDIR$filename\" $URL:$PORT$ENDPOINT"
    $CMD
done

当我运行它时,我得到以下输出

% Total    % Received % Xferd  Average Speed   Time    Time     Time     Current
                             Dload  Upload   Total   Spent    Left  Speed
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--0curl: (6) Could not resolve host: 2018-October-18-10.csv"; Unknown error
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--      0     
curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

如果我在脚本中执行回显$ CMD,我会得到

curl -k -i -H "filename: 2018-October-18-10.csv" -F "data=@/var/log/tyk/2018-October-18-10.csv" https://localhost:9992/endpoint

那行得通

我不能弄清楚我没做错什么事

1 个答案:

答案 0 :(得分:3)

首先,不要将命令存储在变量中。 除此之外,还有两个问题:

  1. 扩展变量内的引号不能像直接键入它们一样起作用。
  2. $()周围的子外壳$($CMD)似乎令人怀疑。您不仅要执行存储在$CMD中的命令,而且还要执行该命令的输出!

1。变量内的引号

当您输入命令echo "a b"时,bash将处理该命令,以便使用参数echo执行a b。输出将为a b

将命令存储在变量中并扩展该变量时,bash将以不同的方式处理变量的内容。将使用参数echo"a执行命令b"。输出将为"a b"

这是错误消息的原因

  

curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

curl试图打开一个内部带有实际引用的路径。这样的路径在您的系统上不存在。

要解决此问题,您可以 编写eval "$cmd",然后将执行该命令,就像直接键入该命令一样。但是,您实际上不应该这样做。我会改写脚本,以将命令存储在变量中。

2。 $cmd周围的子shell:

cmd='echo something'
$cmd

这将打印something。 但是,您的脚本不会止于此,因为您将$cmd括在$()中。因此,输出something也将被执行。

cmd='echo something'
$($cmd)

产生

bash: something: command not found