第五章·shell编程-if流程控制

if条件语句

if语法单分支

# 写法一:
if [  ];then
  cmd1
  cmd2
fi

# 写法二:
if [  ]
then
  cmd1
  cmd2
fi

## 不过单分支,没有必要写if了,直接用条件表达式即可。
[ 条件 ] && {
  cmd1
  cmd2

if语法双分支

# 写法一:
if [  ];then
  cmd1
  cmd2
else
  cmd1
  cmd2
fi

# 写法二:
if [  ]
then
  cmd1
  cmd2
else
  cmd1
  cmd2
fi

if语法多分支

# 写法一:
if [  ];then
  cmd1
  cmd2
elif [  ];then
  cmd1
  cmd2
else
  cmd1
  cmd2
fi

# 写法二:
if [  ]
then
  cmd1
  cmd2
elif [  ]
then
  cmd1
  cmd2
else
  cmd1
  cmd2
fi

实战案例

需求: 接收用户输入的用户名和密码进行登录。

  • 1.根据数据库中的数据判断,如果用户存在则验证密码
  • 2.如果密码错误则返回报错
  • 3.如果密码正确,则登录成功
  • 4.根据数据库中的数据判断,如果用户不存在则注册
    • 1)输入用户名
    • 2)输入密码
    • 3)确认密码
  • 5.如果密码不一致则重新输入
  • 6.如果密码一致,则将注册用户保存到数据库

扩展需求:

  • 判断用户输入的密码,如果小于8位,则报错
  • 判断用户输入的密码,如果没有大小写,则报错
  • 判断用户输入的密码,如果没有数字,则报错
  • 判断用户输入的用户名,如果用户名以数字开头,则报错
判断用户是否存在,bug,密码和要注册的用户名一致的情况下,就出问题

程序逻辑:
    - 登录
        输入用户名
        输入密码
    - 判断用户是否存在
        如果用户存在,则验证密码
        如果用户不存在,则跳转到注册页面
    - 注册页面
        需要输入用户名,也需要判断是否存在
            如果存在,重新输入用户名
        输入注册密码和确认密码
            $pass1 == $pass2
            $pass1 != $pass2
        两次密码不一致,重新输入密码
        两次密码一致,将用户写入数据库,跳转到登录页面

#!/bin/bash

read -p '请输入一个密码: ' pass

if [ ${#pass} -lt 8 ];then
        echo '密码至少8位'
elif [[ $pass =~ ' ' ]];then
        echo '密码中不能包含空格'
elif [[ $pass =~ [0-9] ]] && [[ $pass =~ [a-z] ]] && [[ $pass =~ [A-Z] ]] ;then
        echo '注册成功'
else
        echo '密码要包含数字,大小写字母'
fi

###### 完整代码
[root@m01 ~]# cat login.sh 
#!/bin/bash

. /etc/init.d/functions

user_data_file="/root/user_data.txt"

[ ! -f $user_data_file ] && {
  touch $user_data_file
}

login_page (){
cat <<EOF
+------------------+
| 欢迎来到登录界面 |
+------------------+
EOF
}

register_page (){
cat <<EOF
+------------------+
| 欢迎来到注册界面 |
+------------------+
EOF
}
clear
login_page
read -p '用户名: ' user_name
read -p '密码: ' user_pass

[ ${#user_name} -eq 0 -o ${#user_pass} -eq 0 ] && {
  echo -e "\e[1;31m Error:\e[0m \e[5;31m用户名和密码不能为空\e[0m"
  exit 1
}

user_exists=`awk '{print $1}' $user_data_file | grep -w "$user_name"|wc -l &>/dev/null`
[ $user_exists -eq 0 ] && {
  pass=`grep -w "$user_name" $user_data_file |awk '{print $2}'`
  [ "$pass" == "$user_pass" ] && {
    figlet  welcome
    action "$user_name login accessful" /bin/true
  } || {
    echo -e "\n--------- 登录失败 --------"
    action "$user_name password is missing" /bin/false
    exit 1
  }
} || {
    echo -e "\n--------- 登录失败 --------"
    action "$user_name not exists" /bin/false
    clear
    register_page
    read -p "请输入注册用户名:" register_name
    read -p "请输入注册密码:" register_pass1
    read -p "请确认注册密码:" register_pass2
    grep -w "$register_name"  $user_data_file &>/dev/null
    [ $? -eq 0  ] && {
      echo -e "\n--------- 注册失败 --------"
      echo -e "\e[1;31m Error:\e[0m 用户 \e[5;31m[${register_name}]\e[0m 已存在"
    } || {
      [ $register_pass1 == $register_pass2 ] && {
        echo "$register_name $register_pass1" >> $user_data_file
        awk '{print $1}' $user_data_file | grep -w "$register_name" &>/dev/null
        [ $? -eq 0 ] && {
          echo -e "user \e[5;32m[$register_name]\e[0m register successful"
      login_page
          read -p '用户名: ' user_name
          read -p '密码: ' user_pass
          pass=`grep -w "$user_name" $user_data_file |awk '{print $2}'`
          [ "$pass" == "$user_pass" ] && {
            figlet  welcome
            action "$user_name login accessful" /bin/true
          } || {
            echo -e "\n--------- 登录失败 --------"
            action "$user_name password is missing" /bin/false
            exit 1
          }
        }
      } || {
        echo -e "\nthe password not match"
        echo -e "\n--------- 重新确认密码 --------"
        read -p "请输入注册密码:" register_pass1
        read -p "请确认注册密码:" register_pass2
        [ $register_pass1 == $register_pass2 ] && {
          echo "$register_name $register_pass1" >> $user_data_file
        }
      }
    }
}

山林不向四季起誓 荣枯随缘