에코 명령

에코 명령

ENV 변수를 저장하기 위해 CircleCi 상자를 사용하려고 합니다. 나는 보통 이렇게 합니다:

echo 'export FILE=$(ls bin | head -n 1)' >> $BASH_ENV

이는 간단한 명령에 적합하며 $BASH_ENV에 출력을 생성합니다.

export FILE=$(ls bin | head -n 1)

이제 한 번만 실행하면 되는 확장 명령의 경우 이는 복잡하고 작동하지 않습니다.

echo 'export INSTANCE_ID=$(aws ec2 run-instances --instance-type t3.large\
--image-id $AMI --key-name circleci-key --count 1 --security-group-ids $SG\
--subnet-id $SUBNET --network-interfaces "{\"AssociatePublicIpAddress\": true, \"DeviceIndex\": 0, \"SubnetId\": \"$SUBNET\", \"Groups\": [\"$SG\"]}"\
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=instance-from-circleci}]'\
 | jq '.Instances[0].InstanceId' --raw-output)' >> $BASH_ENV

이 코드는 $BASH_ENV 에 추가되면 실행될 때마다 실행됩니다 source $BASH_ENV.

이 값을 변수에 저장한 다음 이미 최종 형식인 에코된 줄에 추가하는 방법이 있습니까?

그것은 다음과 같습니다:

echo 'export $INSTANCE_ID' >> $BASH_ENV

답변1

따옴표를 이스케이프 처리하는 번거로움을 피하려면 다음 문서를 사용하는 것이 더 쉽습니다.

cat << 'EOF' >> "$BASH_ENV"
export INSTANCE_ID="$(
  aws ec2 run-instances \
    --instance-type t3.large \
    --image-id "$AMI" \
    --key-name circleci-key \
    --count 1 \
    --security-group-ids "$SG" \
    --subnet-id "$SUBNET" \
    --network-interfaces '
      {
        "AssociatePublicIpAddress": true,
        "DeviceIndex": 0,
        "SubnetId": "'"$SUBNET"'",
        "Groups": ["'"$SG"'"]
      }' \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=instance-from-circleci}]' |
  jq '.Instances[0].InstanceId' --raw-output)"
EOF

(또한 누락된 따옴표를 수정하고 가독성을 향상시킵니다.)

EOF( ) 주위의 따옴표가 'EOF'중요합니다. 이것이 없으면 이 문서의 변수 및 명령 대체가 확장되고 \이 문서를 생성할 때 꼬리 부분이 줄 연속으로 처리됩니다.

답변2

이제 한 번만 실행하면 되는 확장 명령의 경우 [...] 이 값을 변수에 저장한 다음 이미 최종 형식인 에코 라인에 추가하는 방법이 있습니까?

기본적으로 섹션을 $BASH_ENV로 인쇄하는 대신 var=$(command...)스크립트 자체에서 명령 대체를 실행한 다음 결과를 인쇄합니다. 그래서:

var=$(some command)
echo "var='$var'" >> file

그러나 이것은 var='value'쉘의 인용 등을 거치게 되므로 값에 작은따옴표가 포함될 수 있으면 깨질 것입니다.

대신 printf %qBash에서 예를 들어 다음을 사용할 수 있습니다.

var=$(some command)
printf "var=%q\n" "$var" >> file

예 를 들어 값이 $var다음과 같은 경우 it ain't so생성됩니다 . var=var=it\ ain\'t\ so보기 흉하지만 실행 시 동일한 값을 생성합니다.

관련 정보