bash - curl 命令在 shell 脚本中不起作用,但在站点上运行良好
问题描述
我正在努力使用一个小的 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""
如果我在我的脚本中执行 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
这工作正常
我无法弄清楚我没有做错什么
解决方案
首先,不要将命令存储在变量中。除此之外,还有两个问题:
- 扩展变量中的引号不起作用,就像您直接输入它们一样。
$()
周围的 subshel$($CMD)
l 似乎很可疑。您不仅执行存储在 中的命令$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
这将打印something
. 但是,您的脚本并不止于此,因为您包含$cmd
在$()
. 因此输出something
也被执行。
cmd='echo something'
$($cmd)
结果是
bash: something: command not found
推荐阅读
- sql - Microsoft SQL Server 2016 安装程序
- react-native - 在 React Native 中构建 Apk 失败
- sql - 选择引用工作表索引的 SQL 查询
- css - 使用 Chrome 的 CSS 滚动捕捉
- javascript - 如何通过将响应的结果与 Vue.js 中路由的动态参数组合来动态获取数据
- google-geolocation - 地理位置 API:未找到请求的实体
- python - 将 html URL 解析为 pandas 表
- javascript - 使用axios收到403错误时如何阻止writestream创建文件
- objective-c - 在 macOS 上禁用屏幕保护程序和显示睡眠的正确方法是什么
- javascript - 如何设置节点服务器同时运行不同的请求?