shell脚本学习:循序渐进程序选择流与正则表达式

 

        shell脚本和其他编程语言一样提供了程序执行流if esle , do while ,for ,case,等。和其他编程语言一样,shell脚本的程序执行流的存在是为建立完整的逻辑思维,通过下面几个脚本来慢慢学习程序执行流。
首先是if else循环与do while循环的格式:
单分支:
if CONDITION ; then                             //需要注意CONDITION语句的格式:[ command ] command左右各有一个空格键,并用[ ]括起来
 statement                                         //statement可以是多条语句
 ...
fi
双分支:
if CONDITION ; then
 statement
 ...
 else
 statement
 ...
fi
多分支:
if CONDITION ; then
 statement
 ...
elif CONDITION ; then
  statement
  ...
fi 
我们来分析一下这个执行流的意思,
第一种:如果条件成立,那么执行statement,也就是说如果不成立,那么就不执行,直接到fi,执行下一个命令,这样的选择可以
让我们轻松的过滤一个条件;例如:如果  [一个人犯法了]  那么  [他就是坏人]       等于默认如果一个人没有犯法,那么他就不是坏人.
第二种:如果条件成立,那么执行statement,执行后到fi,如果不成立,那么执行else里的statement,执行后到fi, 它可以让我们指定两种分支来处理一个条件。
例如:如果 [一个人犯法了] 那么 [他就是坏人] 否则 那么 [他就是一个有待观察的人]   等于在第一种的基础上,又添加了一个处理
第三者:这一种,是第一种和第二种的结合,你可以使用elif 来细化 else的条件 ,既在else里使用if else循环,这样可以细化很多条件并处理,从而得到我们想要
的结果。
————————————————————————————————————————————————————————————————————————————————
do while 循环的格式:
while COMMAND; do
  statemnet;
  ....
  CONDITION
done
解析:while循环可以帮助我们实现一种“循环的处理”,也就是说不断的处理一个或者一些内容,或者是不断的执行某个或某些命令
例如用while循环来计算1~100的和
let N=1
let S=0
while [ N -le 100 ]; do          //-le小于或等于
    S=${$N+$S}                   //设一个计数器S 它等于上一次的S和这一次的N相加,实现累加
    N++                              //N自增1
done                                 //注意while循环解说要加done
echo S                               //输出结果
————————————————————————————————————————————————————————————————————————————————
for 循环
for I in LIST ; do
  statement1
  statement2
done
LIST的格式: 简单列表: 1 2 3 4
              复杂列表: This is TOM`s cat
              命令    : `ls /var`
              通配符  : for I in /var/*
列表可是说是for循环的核心,列表可以是命令,数字,文本,甚至是路径。它的处理方法灵活多变,在很多时候for循环的时候可以很清晰明了完成逻辑关系。

下边通过几个例子,来学习这些常见的程序执行流。
写一个脚本:
1、判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
2、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。c
##使用read -p命令,可以让打印提示信息并让用户输入一个变量的值
#!/bin/bash
#TEST=`bash +n $1`                  //测试脚本是否有语句错误
if [ $TEST!=0 ]; then                   //如果有错误,往下执行,否则,执行else语句
   read -p “Q|q for quiting:”INPUT   //提示按q或Q退出,并要求用户输入
  if [ "$INPUT" == 'Q' -o "$INPUT" == 'q' ];then            //判断输入的信息
  echo "quiting"                                                              
  else
    while [ $TEST!=0 -a "$INPUT" != 'Q' ]; do        //循环判断,如果还有错误并且没有输入Q
      vim $1                                          //打开vim编辑
      TEST=`bash +n $1`                                  //再一次测试语法错误
      read-p "Q|q for quiting:" INPUT            //再一次提示是否退出
      INPUT=`echo "$INPUT" | tr 'a-z' 'A-Z'`          //这里将用户输入的小写字母变为大写
    done
  fi
fi
unset TEST INPUT
##此脚本运用了一个多支if else循环,和一个for循环,在判断用户输入时,第一个简单的if语句即可实现,但是第二个需将其转换为大写来满足脚本要求。

 

写一个脚本:
1、向系统中添加20个用户,名字为linuxer1-linuxer20,密码分别为其用户名,要使用while循环;
2、要求:在添加每个用户之前事先判断用户是否存在,如果已经存在,则不再添加此用户;
3、添加完成后,显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码,形如

#!/bin/bash

#

FILE=/etc/passwd
let N=1
while [ $N -le 20 ] ; do
  grep "linuxer$N" $FILE >> /dev/null || useradd "linuxer$N";echo "linuxer$N" | passwd --stdin "linuxer$N"       //    ||  或运算,条件不成立则执行下面的语句,成立则不执行下一条语句
let N++
done
for I in {1..20}; do                          //for循环,从1~20执行                     
  grep "linuxer$I" $FILE |             //抓取用户名linuxer1~20
    awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}'         //awk语句,在下一篇文章介绍
done

 

 

 

 

 

 

 

 

你可能感兴趣的:(正则表达式,shell,command,脚本,vim,input)