我有一个脚本问题,该脚本应该执行curl
由给定参数组成的命令。如果我eval
在子 shell 中使用,它会起作用,但是我想避免这样做,因为根据这
以下是脚本的相关部分:
#!/bin/bash
COMMAND="curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"
echo $(eval $COMMAND)
使用 eval 时,我根据给定凭据的有效性获得 201 或 401,正如预期的那样。如果我删除 eval 并使用,echo $($COMMAND)
我会得到 400,这表明数据参数构造错误。
有人能向我解释一下,如何构造命令以便可以直接将其传递给子 shell 吗?
答案1
您可以使用反引号或嵌套来避免使用 eval。
反引号
$ var=\`curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"\`
嵌套
$ var = $(curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'")
绝大多数 shell 都支持嵌套,并且比反引号更具可读性。
答案2
谢谢皮埃尔。
经过多次尝试,终于找到了适合放置哪种引号的位置,并成功实现了这个功能:
$(curl -s -o /dev/null -w '%{http_code}' -X POST -H "Content-Type:application/json" -H "Accept:application/json" https://example.com/login -d "{\"username\":"\"$1\"",\"password\":"\"$2\""}")