Bash 将输出存储在变量中,解析并存储一些值供以后使用

标签 bash curl

因此,我正在尝试编写脚本以在 Rackspace Cloud 上创建服务器。我已经能够获取成功创建服务器的脚本。虽然,在创建服务器后,我需要从输出中获取一些数据并将它们存储在一个变量中,以供以后在同一脚本中使用(创建后将在新服务器上做一些事情)。

这是我用来创建服务器的脚本:

#!/bin/bash

# Ask user to continue or not
read -p "You are about to setup a new Rackspace cloud server. Would you like to continue (y/n)? " cont
if [ "$cont" == "y" ]; then
    echo "Starting server setup script..."

    # 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 -m json.tool \
        | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]')
    echo "...done!"

    # Get Rackspace account id
    echo "Getting account id..."
    account=$(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 -m json.tool \
        | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["tenant"]["id"]')
    echo "...done!"

    # Create a new Rackspace cloud server
    echo "Creating a new Rackspace cloud server..."
    serverpassword=$(curl -s -X POST https://dfw.servers.api.rackspacecloud.com/v2/$account/servers \
        -H "Content-Type: application/json" \
        -H "X-Auth-Token: $token" \
        -H "X-Auth-Project-Id: test-project" \
        -T server_build.json \
        | python -m json.tool \
        | python -c 'import sys, json; print json.load(sys.stdin)["server"]["adminPass"]')
    echo "...done!"

    echo "Your new server has been created!"

    read -p "Would you like to continue on to setting up your new server (y/n)? " cont2
    if [ "$cont2" == "y" ]; then
        exit
    else
        echo "Here is your root password for this server (you must write this down now): $serverpassword"
        exit
    fi
else
  echo "You have chosen not to setup a new Rackspace server."
  exit
fi

您可以看到在创建 curl 命令中设置和使用了 token 和 account 变量。最后一个 curl 命令输出如下内容:(删除了实际值)

{
    "server": {
        "OS-DCF:diskConfig": "AUTO",
        "adminPass": "************",
        "id": "************",
        "links": [
            {
                "href": "https://dfw.servers.api.rackspacecloud.com/v2/...",
                "rel": "self"
            },
            {
                "href": "https://dfw.servers.api.rackspacecloud.com/...",
                "rel": "bookmark"
            }
        ]
    }
}

我希望能够将 adminPassid 存储在两个不同的变量中。我怎样才能做到这一点?我还知道,通过解决这个问题,我将能够在使用一个 curl 命令而不是两个不同的命令获取 tokenaccount 值时重构脚本。

感谢您的帮助!

最佳答案

感谢所有的帮助。我能够弄清楚我需要做什么。也许我最初的问题没有以获得最佳答案的方式措辞,但希望这个决议能更好地解释我试图完成的事情。

我最终将这些命令用于第 3 个 curl 命令并设置了我需要的变量:

serverinfo=$(curl -s https://dfw.servers.api.rackspacecloud.com/v2/731174/servers \
    -X POST \
    -H "Content-Type: application/json" \
    -H "X-Auth-Token: $token" \
    -H "X-Auth-Project-Id: test-project" \
    -T server_build.json | python -m json.tool)

serverpass=$(echo $serverinfo | python -c 'import sys, json; print json.load(sys.stdin)["server"]["adminPass"]')

这让我可以运行 curl 命令来设置服务器,然后从该命令的输出中获取 adminPass 并将其设置为 serverpass 变量供以后使用.

使用这个概念,我还能够删除第二个 curl 命令,因为它是一个重复的命令,只是为了设置一个变量。我现在可以使用这些命令摩擦 curl 一次并从其输出设置两个变量:

tokensinfo=$(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")

token=$(echo $tokensinfo | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]')
account=$(echo $tokensinfo | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["tenant"]["id"]')

希望这能更好地解释我的目的。感谢您的帮助,它确实帮助我找到了这个解决方案。

关于Bash 将输出存储在变量中,解析并存储一些值供以后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109671/

相关文章:

php - 如果启用了 libcurl,我可以假设所有 setopt 选项都可用吗?

linux - 如何替换 bash 脚本中的 'bc' 工具?

bash - 如何保存ssh登录欢迎横幅并断开连接

bash - 如何在不解压缩的情况下从 gzip 文件中删除第一行?

python - 如何在 Google Compute Engine 上授权进入 BigQuery?

macos - 是否可以将 curl 设置为在进度条之前显示文件名?

linux - "$()"或 `` 未正确扩展 shell 脚本中的 linux 命令

php - 为网络爬虫优化 PHP CURL

curl - 通过 curl 和 Airflow 的实验性 rest api 使用 Airflow 运行 dag

linux - curl 表达式之间的区别