我有一个脚本应该执行由给定的参数组成的curl命令的问题。 它工作,如果我在子shell中使用eval ,但是,我想避免,因为它似乎是不好的风格据此
这里是脚本的相关部分:
#!/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,这表明一个错误构造的数据参数。
有人可以向我解释,我如何构build命令,以便我可以直接将它传递给子shell?
您可以使用反引号或嵌套来避免使用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上都支持,比反引号更具可读性。
谢谢皮埃尔
经过一些尝试和错误的地方哪些地方哪些地方引用我终于得到这个工作:
$(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\""}")