
다음과 같은 작업 코드가 있습니다(AWS 자동 배포를 위한 CloudFormation 템플릿 내에 있음).
EFS_SERVER_IPS_ARRAY=( $(aws efs describe-mount-targets --file-system-id ${SharedFileSystem} | jq '.MountTargets[].IpAddress' -r) )
echo "IPs in EFS_SERVER_IPS_ARRAY:"
for element in "${EFS_SERVER_IPS_ARRAY[@]}"
do
echo "$element"
echo "$element $MOUNT_SOURCE" >> /etc/hosts
done
이것은 작동하지만 보기 흉해 보입니다. 배열 변수와 루프를 피하고 싶습니다 for
(기본적으로 첫 번째 echo 명령은 신경 쓰지 않습니다).
어떻게든 출력(1개 이상, 현재 2개 행의 IP인 $element)을 사용하여 다음과 같이 두 가지 실행으로 분류할 수 있습니다.
long AWS command >> echo $element $MOUNT_SOURCE >> /etc/hosts
현재 구현에서는 배열에 있는 변수 수만큼 echo가 실행됩니까? 이것을 어떻게 다시 쓰겠습니까?
AWS 명령의 출력은 다음과 같습니다.
10.10.10.10
10.22.22.22
그러면 추가된 줄은 /etc/hosts
다음과 같습니다.
10.10.10.10 unique-id.efs.us-east-1.amazonaws.com
10.22.22.22 unique-id.efs.us-east-1.amazonaws.com
답변1
aws efs describe-mount-targets --file-system-id ${SharedFileSystem} \
| jq --arg mntsrc "$MOUNT_SOURCE" '.MountTargets[].IpAddress | . + $mntsrc' -r >> /etc/hosts
아니면 원하신다면,
aws efs describe-mount-targets --file-system-id ${SharedFileSystem} \
| jq '.MountTargets[].IpAddress' -r | sed -e "s~\$~$MOUNT_SOURCE~" >> /etc/hosts
일어나는 일은 각 줄의 끝에 추가로 고정된 텍스트가 추가되는 것뿐입니다. 이는 jq
내부(상단) 또는 외부(하단)에서 다양한 방식으로 발생할 수 있습니다. 여기에는 실제로 배열 컨텍스트나 반복되는 항목이 없으므로 루프가 필요하지 않습니다.