Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行AWS CLI时Bash脚本变量值发生更改_Bash_Amazon Web Services_Aws Cli - Fatal编程技术网

运行AWS CLI时Bash脚本变量值发生更改

运行AWS CLI时Bash脚本变量值发生更改,bash,amazon-web-services,aws-cli,Bash,Amazon Web Services,Aws Cli,我编写这个脚本是为了捕获AWS区域中的所有实例,然后将AZ、VolumeId、InstanceId和卷大小打印到一个文件中。在第13行之前,执行似乎很顺利。所有值均按预期接收。我得到了所需的实例id。我已经使用for循环检查了instance\u id变量中的值,并且我有多个id。当脚本到达第14行时,出现一个错误,表示没有实例id。echo命令在变量中显示实例id,但descripe instance命令似乎没有收到它。 这是我的剧本: #!/bin/bash envs=("aws_cloud

我编写这个脚本是为了捕获AWS区域中的所有实例,然后将AZ、VolumeId、InstanceId和卷大小打印到一个文件中。在第13行之前,执行似乎很顺利。所有值均按预期接收。我得到了所需的实例id。我已经使用for循环检查了
instance\u id
变量中的值,并且我有多个id。当脚本到达第14行时,出现一个错误,表示没有实例id。
echo
命令在变量中显示实例id,但
descripe instance
命令似乎没有收到它。 这是我的剧本:

#!/bin/bash
envs=("aws_cloud" "aws_dev" "aws_prod")
i=0
vols=""
echo "AvailabilityZone  ,   VolumeId    ,   InstanceId  ,   Size">>untagged_volumes.txt
for env in aws_cloud aws_dev aws_prod
    do
    for region in ca-central-1 us-east-1 us-west-2 eu-west-1 eu-central-1 ap-southeast-1 ap-southeast-2
    do
        instance_id=$(aws ec2 describe-volumes --profile=${env} --region=${region} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{InstanceId:Attachments[0].InstanceId}' --output text ) 
        for instance in "${instance_id}"
        do
            ec2_name=$(aws ec2 describe-instances --profile=${env} --region=${region} --instance-ids=${instance} --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value]' --output text)

            vol_info=$(aws ec2 describe-volumes --profile=${env} --region=${region} --filters Name=attachment.instance-id,Values=${instance} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output text)
            echo "${env}    ${ec2_name}""${vol_info}">>untagged_volumes.txt
        done
    done
    i=${i+1}
done
我试着调试是疯了。任何帮助都将不胜感激。谢谢

编辑: 因此,在几个小时的错误观察之后,我了解到,对于一个实例,返回了一个id,然后返回了一个字符串,该字符串包含该实例id和单引号

调用时发生错误(InvalidInstanceID.NotFound) DescribeInstance“不存在实例ID”i-02f4a---------------

所以我检查了我得到的任何大于实例id长度的值。根据aws文档,他们说实例的id长度是固定的,对于i和-,是17+2。在检查任何长度超过19的实例id后,我们只能使用长度为19的id。 以下是正确的代码(适用于可能需要它的任何人)


谢谢大家的帮助。

我相信这篇文章将帮助您更正脚本


实例id=$(aws ec2描述卷--查询“卷[?!非空(标记[?键==`Name`].Value)&&(附件[?状态!=”“])。{InstanceId:Attachments[0]。InstanceId}--输出文本);对于${instance_id}中的i;aws ec2是否描述实例——实例ID=${i};完成

感谢每个人为你花时间。也为这么长时间后的发布。问题不在于代码。问题是由gitbash终端引起的。当我在ubuntu终端上运行代码时,代码执行得非常完美。

为什么需要行
instance\u id=($instance\u id)
?@NuneIsabekyan nvmind,它来自脚本的初始版本。我会把它去掉。但是我已经检查了错误是否仍然存在。
例如在“${instance\u id}”中,
将只通过一次,因为有引号。如果
${instance\u id}
不止一个,请删除引号。另外
set-x
是您的朋友。。。把它放在最上面,你可能会很快发现问题。@AronGriffis,我不明白你关于报价的观点。当我使用引号检查时,返回的实例是2,当我不使用引号检查时,返回的实例是3。请详细说明
#!/bin/bash
envs=("aws_cloud" "aws_dev" "aws_prod")
vols=""
echo "Environemnt   ,   InstanceName    ,   AvailabilityZone    ,   VolumeId    ,   InstanceId  ,   Size">>untagged_volumes.txt
for env in aws_cloud aws_dev aws_prod
    do
    for region in ca-central-1 us-east-1 us-west-2 eu-west-1 eu-central-1 ap-southeast-1 ap-southeast-2
    do
        instance_id=$(aws ec2 describe-volumes --profile=${env} --region=${region} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{InstanceId:Attachments[0].InstanceId}' --output text );
        for j in ${instance_id}
        do
            if [[ "${#j}" -gt 19 ]] || [[ "${#j}" -lt 19 ]]
            then
                continue
            else
                ec2_name=$(aws ec2 describe-instances --profile="${env}" --region="${region}" --instance-ids="${j}" --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value]' --output text)

                vol_info=$(aws ec2 describe-volumes --profile=${env} --region=${region} --filters Name=attachment.instance-id,Values="${j}" --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output text)
                echo "${env}    ${ec2_name}     ""${vol_info}">>untagged_volumes.txt
            fi
        done
    done
done