首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有If和Elif逻辑中断的Bash For循环

带有If和Elif逻辑中断的Bash For循环
EN

Stack Overflow用户
提问于 2016-08-18 02:08:24
回答 1查看 48关注 0票数 0

我已经玩了40多天的bash脚本,没有经验,所以如果我的代码看起来像垃圾,请原谅我。我有一个脚本可以将已配置的NTP服务器从/etc/ntp.conf文件(/root/ntp.conf用于测试)中取出

代码语言:javascript
复制
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)

并询问您是否要使用case语句进行更改:

代码语言:javascript
复制
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.地址,对吗?:)

代码语言:javascript
复制
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"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-18 02:24:25

if中的条件设置$?的值,这是elif部分中的条件使用的值,而不是is_fqdn的返回值。如果您想在多个地方使用该值,则需要保存该值:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39003552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档