![else 조건이 있는 경우 트리밍을 위한 쉘 스크립트](https://linux55.com/image/171410/else%20%EC%A1%B0%EA%B1%B4%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%ED%8A%B8%EB%A6%AC%EB%B0%8D%EC%9D%84%20%EC%9C%84%ED%95%9C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8.png)
아래 스크립트를 실행하면 성공적인 출력을 얻습니다. 여기서 시도하는 것은 아래 나열된 모든 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
.추측하다version
JSON 데이터에는 최상위 키가 있습니다.
ssh
ssh -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