2014-02-28 108 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