2014-02-28 111 views
2

我想写一个脚本,将设置一个Rackspace云服务器,我遇到了一个方面的问题。脚本运行时,会询问用户几个问题以获取用户名和API密钥。然后我在curl命令中使用这些值。 curl命令的输出也需要分配给一个变量。这是我的 - 我在想这只是一个语法错误,我错过了。这不是整个剧本,它只是我遇到麻烦的唯一部分。如何在bash curl命令中使用提示中的变量?

#!/bin/bash 

# Ask questions to get login creds 
read -p "Rackspace Username? " username 
read -p "Rackspace API Key? " apikey 

# Get Rackspace token 
echo "Getting token..." 
token=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \ 
    -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"$username", "apiKey":"$apikey" } } }' \ 
    -H "Content-type: application/json" \ 
    | python -mjson.tool \ 
    | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]') 
echo "...done!" 

..... 

回答

3

与下面的线的问题是,$username$apikey都在里面单引号和bash的变量不是单引号里评价:

-d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"$username", "apiKey":"$apikey" } } }' \ 

为了解决这个问题,结束单引号字符串变量的bash之前再次然后再启动它:

-d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":'"$username"', "apiKey":'"$apikey"' } } }' \ 

如果你需要的字符串为它工作在字面双引号,那么我们必须添加他们在字符串的单引号部分内:

-d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"'"$username"'", "apiKey":"'"$apikey"'" } } }' \ 
+0

谢谢!我做了一个小小的调整来实现它的功能。必须将''“$ username”''改为'“'$ username'”',并且对于apikey也是如此。 – ryanpitts1

+0

@ ryanpitts1很高兴工作。为了最大的安全性,它应该是''''$ username''“'。这提供了curl看到的字面双引号。它还会导致bash评估双引号字符串中的变量,如果空格应该出现在变量的值中,这很重要。正如你在评论,我加入了一个最终版本,其中包含了这个。 – John1024

+0

好的,太好了,谢谢你的解释! – ryanpitts1