2016-08-17 50 views
0

我一直在玩bash脚本40天,有0经验,所以原谅我,如果我的代码看起来像废话。我有一个脚本,如果你想用的情况下进行更改,将采取配置的NTP服务器出/etc/ntp.conf中的文件(/root/ntp.conf用于测试)Bash For Loop With If Elif Logic Broken

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) 

,并问你声明:

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 

问题是在函数的第二次运行中使用“elif”语句和函数“is_fqdn”。如果我在脚本上放置了“bash -x”并运行它,我看到“is_fqdn”在函数的两次运行中都返回0,但elif语句“$?”即将达到1而不是0.

使用的两个函数如下。必须验证NTP地址是有效的域名还是I.P.地址,对吧? :)

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

回答

1

条件在if$?的价值,这是何等的使用条件在elif部分,而不是is_fqdn返回值。如果要在多个位置使用该值,则需要保存该值:

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

谢谢!!!!这工作!学到了一些东西! – emdk