2016-08-17 1 views
0

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" 
} 

Antwort

1

Die Bedingung in Ihrem if setzt den Wert von $?, und das ist, was durch den Zustand in dem Teil elif verwendet wird, nicht den Rückgabewert von is_fqdn. Sie müssen den Wert speichern, wenn Sie ihn an mehreren Stellen verwenden möchten:

is_fqdn "$NTP" 
is_fqdn_rv=$? 
if [[ $is_fqdn_rv == 0 && $NTPSRVCounter2 == 1 ]] ; then 
    SEDUserInput1=$(echo $UserInputNTP1 | sed 's/\./\\./g') 
    ((NTPSRVCounter2++)) 
elif [[ $is_fqdn_rv == 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 
+0

Vielen Dank !!!! Das hat funktioniert!! Habe auch etwas gelernt! – emdk