else 조건이 있는 경우 트리밍을 위한 쉘 스크립트

else 조건이 있는 경우 트리밍을 위한 쉘 스크립트

아래 스크립트를 실행하면 성공적인 출력을 얻습니다. 여기서 시도하는 것은 아래 나열된 모든 VM에 연결해야 하며 스크립트 ssh가 wasadmds03출력을 다음과 같이 인쇄해야 할 때 product detail다른 VM과 유사하게 명령도 실행해야 한다는 것입니다. "cat /source/package.json | grep 버전"모든 가상 머신에서.

필요한 출력을 얻었습니다. 하지만 반복되는 "if then" 문을 잘라내는 방법이 있습니까? 저는 "if then" 문을 네 번 사용했습니다. 50개의 가상 머신으로 비슷한 연습을 하고 싶다면 이 프로그램을 더 짧은 방식으로 작성할 수 있는 방법이 있습니까?

wasadmds03 - product detail
wasadmds04 - product list
wasadmls03 - Cart
wasadmls05 - checkout
  • 스크립트

**

#!/bin/bash
for i in `cat /tmp/ms_test`
do
        if [ $i = wasadmds03 ]
        then
            echo "Product Detail"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmds04 ]
        then
            echo "Product list"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmls03 ]
        then
            echo "Merchant"
            ssh $i "cat /source/package.json | grep version"
        fi
        if [ $i = wasadmls05 ]
        then
            echo "Account Details"
            ssh $i "cat /source/package.json | grep version"
        fi
done

답변1

따라서 문제는 파일에서 읽은 호스트 이름을 기반으로 특정 레이블을 출력하려는 ​​것 같습니다.

우리는 확실히 코드를 약간 압축할 수 있습니다. 각 호스트마다 달라야 하는 텍스트 레이블을 연관 배열에 저장하면 다음과 같이 끝날 수 있습니다.

printf '%s\n' "${labels[$remote]}"
ssh -n "$remote" 'cat /source/package.json' | jq -r .version

...루프 내에서.

i여기에서는 루프 변수의 이름을 좀 더 설명적으로 자유롭게 바꾸었습니다 remote. 나도 printf대신 사용하고 있습니다 echo('왜 printf가 echo보다 나은가요?jq")를 사용하는 대신 실제 JSON 파서를 사용하여 JSON 데이터 파일을 구문 분석하기로 선택했습니다 grep.추측하다versionJSON 데이터에는 최상위 키가 있습니다.

sshssh -n우리가 사용하고 있는 루프 반복의 입력을 읽지 않도록 호출해야 합니다 .

배열 labels은 다음과 같이 생성될 수 있습니다:

declare -A labels
labels=(
    ['wasadmds03']='Product Detail'
    ['wasadmds04']='Product List'
    ['wasadmls03']='Merchant'
    ['wasadmls05']='Account Details'
)

원격 호스트 이름이 더 많은 경우 유사한 방식으로 이 배열에 나열되어야 합니다. 이 데이터를 다른 방식으로 제공하는 것이 아니기 때문에 각 항목을 나열해야 합니다.

이는 원격 호스트 이름을 올바르게 읽는 것과 함께 /tmp/ms_test수행됩니다(""IFS=read-r-line" 이해")는 다음 스크립트를 제공합니다.

#!/bin/bash

declare -A labels
labels=(
    ['wasadmds03']='Product Detail'
    ['wasadmds04']='Product List'
    ['wasadmls03']='Merchant'
    ['wasadmls05']='Account Details'
)

while IFS= read -r remote; do
    printf '%s\n' "${labels[$remote]}"
    ssh -n "$remote" 'cat /source/package.json' | jq -r .version
done </tmp/ms_test

관련 정보