다음과 같이 163개 사이트(전국 매장)의 핑을 확인하는 bash 스크립트가 있습니다.
#!/bin/bash
#storestest.sh
#version 0.9.2
clear;
printf "Check stores procedure started; `date +"%d/%m/%Y %H:%M:%S"`\n";
declare -a STORESITE=($(cat 'stores.txt' | awk -F, '{print $1}')); # Declaring an array and populated by the file stores.txt
declare -i UP=0; # Create a variable to serve as a counter for stores that are up
declare -i DOWN=0; # Create a variable to serve as a counter for stores that are down
touch storesdown.txt; # Create a file if does not exist to store the list of the store the stores that are down
printf "" > storesdown.txt; # Clear the contents of the file
touch storesup.txt; # Create a file if does not exist to store the list of the store the stores that are up
printf "" > storesup.txt; # Clear the contents of the file
whiptail --title "Testing stores connectivity" --backtitle "Store Test" --yes-button "OK" --no-button "Cancel" --yesno "Check stores procidure has started" 10 50
if [ $? -ne 0 ]; then
exit;
fi
for i in "${STORESITE[@]}" ; do
ping -c 3 $i > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
echo "$i is up" >> storesup.txt;
let UP++
sleep 1
else
echo "$i is down" >> storesdown.txt;
let DOWN++
sleep 1
fi
printf "Total: $UP are online and $DOWN are off line.\r";
done
echo "Total: $UP are online and $DOWN are off line.";
exit;
위의 스크립트는 잘 작동했지만 전체 진행 상황을 표시하는 게이지를 추가하여 좀 더 멋지게 만들기로 결정했습니다. 이것이 내가 다음에 한 일입니다:
#!/bin/bash
#storestest.sh
#version 0.9.3
clear;
printf "Check stores procedure started; `date +"%d/%m/%Y %H:%M:%S"`\n";
declare -a STORESITE=($(cat 'stores.txt' | awk -F, '{print $1}')); # Declaring an array and populated by the file stores.txt
declare -i UP=0; # Create a variable to serve as a counter for stores that are up
declare -i DOWN=0; # Create a variable to serve as a counter for stores that are down
touch storesdown.txt; # Create a file if does not exist to store the list of the store the stores that are down
printf "" > storesdown.txt; # Clear the contents of the file
touch storesup.txt; # Create a file if does not exist to store the list of the store the stores that are up
printf "" > storesup.txt; # Clear the contents of the file
whiptail --title "Testing stores connectivity" --backtitle "Store Test" --yes-button "OK" --no-button "Cancel" --yesno "Check stores procidure has started" 10 50
if [ $? -ne 0 ]; then
exit;
fi
total="${#STORESITE[*]}";
{
for ((g = 0; g <= $(( $total -1)); g++)); do
for i in "${STORESITE[@]}"; do
ping -c 3 $i > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
echo "$i is up" >> storesup.txt;
let UP++
sleep 2
else
echo "$i is down" >> storesdown.txt;
let DOWN++
sleep 2
fi
printf "Total: $UP are online and $DOWN are off line.\r";
done
sleep 1
echo $g
done
} | whiptail --gauge "Please wait" 6 60 0
echo "Total: $UP are online and $DOWN are off line.";
exit;
이것은 내가 생각했던 것처럼 작동하지 않습니다... 이것은 최소한 채찍 꼬리가 작동하도록 하기 위해 내가 생각하고 쓸 수 있는 가장 좋은 방법이지만 분명히 이 방법이 하고 있는 일은 중첩된 루프를 건너뛰는 것입니다.
PS 나는 내 코딩 중 일부가 구식이고 구식 bash 스크립팅이라는 것을 알고 있습니다.
답변1
귀하의 스크립트에는 추가 루프(어쨌든 실행됨)가 있습니다. 배열에 ping을 보내는 중입니다.아래 첨자배열의 아래 첨자 멤버가 아닌.
추가 루프가 없는 버전은 다음과 같습니다(예상대로 ping이 실행됨 $site
).
#!/bin/bash
#storestest.sh
#version 0.9.3
clear;
printf "Check stores procedure started; `date +"%d/%m/%Y %H:%M:%S"`\n";
declare -a STORESITE=($(cat 'stores.txt' | awk -F, '{print $1}')); # Declaring an array and populated by the file stores.txt
declare -i UP=0; # Create a variable to serve as a counter for stores that are up
declare -i DOWN=0; # Create a variable to serve as a counter for stores that are down
touch storesdown.txt; # Create a file if does not exist to store the list of the store the stores that are down
printf "" > storesdown.txt; # Clear the contents of the file
touch storesup.txt; # Create a file if does not exist to store the list of the store the stores that are up
printf "" > storesup.txt; # Clear the contents of the file
total="${#STORESITE[*]}";
whiptail --title "Testing stores connectivity" --backtitle "Store Test" --yes-button "OK" --no-button "Cancel" --yesno "Check stores procedure has started, with $total stores" 10 50
if [ $? -ne 0 ]; then
exit;
fi
{
UP=0
DOWN=0
for ((g = 0; g <= $(( $total -1)); g++)); do
site="${STORESITE[$g]}"
ping -c 3 $site > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
echo "$site is up" >> storesup.txt;
let UP++
else
echo "$site is down" >> storesdown.txt;
let DOWN++
fi
# sleep 2
# stdbuf --output=L printf "Total: $UP are online and $DOWN are off line.\r"
stdbuf --output=L echo $(( ( g * 100 ) / total ))
sleep 1
done
} | whiptail --gauge "Please wait" 6 60 0
online=$(wc -l storesup.txt | awk '{print $1;}')
offline=$(wc -l storesdown.txt | awk '{print $1;}')
echo "Total: $online are online and $offline are off line.";
exit;
기타 수정 사항:
stdbuf
출력을 해봤습니다라인 버퍼(이렇게 하면 측정기가 예상대로 작동하는 데 도움이 됩니다.)- 리디렉션은
UP
및DOWN
하위 프로세스에 배치되므로 합계가 마지막 행에 도달하지 않습니다. 나는 출력 파일의 줄 수를 세어 이 문제를 해결했습니다. - 마지막으로 진행률 표시줄에 백분율이 표시됩니다.