curl 命令在 shell 脚本中不起作用,但在站点上运行良好

hav*_*age 0 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
Run Code Online (Sandbox Code Playgroud)

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

% 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""
Run Code Online (Sandbox Code Playgroud)

如果我在我的脚本中执行 echo $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
Run Code Online (Sandbox Code Playgroud)

这工作正常

我不知道我没有做错什么

Soc*_*owi 5

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

  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

cmd='echo something'
$cmd
Run Code Online (Sandbox Code Playgroud)

这将打印something. 但是,您的脚本并不止于此,因为您包含$cmd$(). 因此输出也something被执行。

cmd='echo something'
$($cmd)
Run Code Online (Sandbox Code Playgroud)

结果是

bash: something: command not found
Run Code Online (Sandbox Code Playgroud)