Bash:无需 eval 即可从变量执行命令

Bash:无需 eval 即可从变量执行命令

我有一个脚本问题,该脚本应该执行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\""}")

相关内容