Ich habe mit Bash Scripting für 40'ish Tage mit 0 Erfahrung so vergib mir spielen, wenn mein Code wie Mist aussieht. Ich habe ein Skript, das den konfigurierten NTP-Server aus der /etc/ntp.conf Datei (/root/ntp.conf zum Testen) nehmenBash For-Schleife Mit Wenn & Elif Logic Gebrochene
NTPSRVCounter=1
echo "--- NTP Configuration ---"
echo " "
while read -r line; do
if [ $NTPSRVCounter == 1 ] ; then
echo "Primary NTP: $line"
SEDConfiguredNTP1="$(echo $line | sed 's/\./\\./g')"
((NTPSRVCounter++))
echo " "
else
SEDConfiguredNTP2="$(echo $line | sed 's/\./\\./g')"
echo "Secondary NTP: $line"
echo ""
fi
done < <(grep -o -P '(?<=server).*(?= iburst)' /root/ntp.conf)
Und fragen Sie, ob Sie es mit einem Fall ändern mögen Erklärung:
echo "Do you wish to change it? [Y/n]"
NTPSRVCounter2=1
read opt
case $opt in
Y|y) read -p "Enter in your primary NTP server: " -e -i '0.debian.pool.ntp.org' UserInputNTP1
read -p "Enter in your secondary NTP serer: " -e -i '1.debian.pool.ntp.org' UserInputNTP2
for NTP in "$UserInputNTP1" "$UserInputNTP2" ; do
is_fqdn "$NTP"
if [[ $? == 0 && $NTPSRVCounter2 == 1 ]] ; then
SEDUserInput1=$(echo $UserInputNTP1 | sed 's/\./\\./g')
((NTPSRVCounter2++))
elif [[ $? == 0 && $NTPSRVCounter2 == 2 ]] ; then
SEDUserInput2=$(echo $UserInputNTP2 | sed 's/\./\\./g')
sudo sed -i "s/$SEDConfiguredNTP1/$SEDUserInput1/g" /root/ntp.conf
sudo sed -i "s/$SEDConfiguredNTP2/$SEDUserInput2/g" /root/ntp.conf
else
echo "Fail!!! :-("
fi
done
;;
N|n) return 0
;;
*) echo "I don't know what happened, but, eh, you're not supposed to be here."
;;
esac
Das Problem ist mit dem „Elif“ Anweisung und die Funktion „is_fqdn“ auf dem zweiten Lauf der Funktion. Wenn ich "bash -x" auf das Skript setze und es ausführe, sehe ich, dass "is_fqdn" bei beiden Läufen der Funktion 0 zurückgibt, aber die elif-Anweisung "$?" wird als 1 anstelle von 0 angezeigt.
Die zwei verwendeten Funktionen sind unten. Sie müssen NTP-Adressen entweder als gültige Domänennamen oder als IP-Adressen validieren. Adressen, oder? :)
is_fqdn() {
hostname=$1
if [[ "$hostname" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
valid_ip "$hostname"
elif [[ "$hostname" == *"."* && "$hostname" != "localhost." && "$hostname" != "localhost" ]] ; then
return 0
else
return 1
fi
host $hostname > /dev/null 2>&1 || return 1
}
valid_ip(){
local stat=1
local ip=$1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS="."
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return "$stat"
}
Vielen Dank !!!! Das hat funktioniert!! Habe auch etwas gelernt! – emdk