linux学习之shell的流程控制



ⅰ、shell之选择执行语句


  1、  用法:if CONDITION;then

               if-true-分支

             fi

//CONDITION是if的判断语句,如果判断的结果为真,则执行if-true-分支;

//如果判断的结果为假,则不执行

例:

linux学习之shell的流程控制

linux学习之shell的流程控制


          if CONDITION;then

              if-true-分支

          else 

              if-false-分支

          fi

//CONDITION的判断结果为真,则执行if-true-分支语句;

//如果判断的结果为假,则执行if-false-分支语句;


linux学习之shell的流程控制

linux学习之shell的流程控制


2、位置参数变量


/bin/bash bashname.sh file1 file2

//bashname.sh的位置参数为$0

//file1的位置参数为$1

//以此类推......

//file10超过10个位置参数的引用就需要${10}

特殊变量

 $?:命令执行的结果;

 $#:传递个脚本或函数的参数个数;

 $*和[email protected]:引用传递个脚本或函数的参数列表

linux学习之shell的流程控制

linux学习之shell的流程控制




轮替:shift [n]


3、与用户交互

  使用read命令与用户交互;

  方法:

      read [Options] chera

         [Options] 

           -p "PROMPI" //提示信息

           -t timeout //超时时间

例:

linux学习之shell的流程控制

linux学习之shell的流程控制




4、命令引用

 用法: `COMMAND`,$(COMMAND)

例子:

echo `date`

echo $(date)

linux学习之shell的流程控制

linux学习之shell的流程控制


练习:写一个脚本,判断给定的两个数值大小,给定的数值使用脚本参数以及用户交互

#!/bin/bash
#这个脚本是通过用户交互的模式获得两个参数,然后比较大小
read -p "请输入两个数:" -t 10 n1 n2
if [ $n1 -ge $n2 ];then
   echo "Max num: $n1, Min num: $n2"
else
   echo "Max num: $n2, Min num: $n1"
fi

linux学习之shell的流程控制

linux学习之shell的流程控制




ⅱ、循环语句:


    循环式将循环体执行0或多次:

      需要循环必须满足进入条件

      如要推出必须满足推出条件

使用for while 以及until都可以完成循环语句的控制


1、for语句

用法

for VARIABLE in LIST;do

    循环体

done


LIST:是有一个或多个空格分割的字符串组成,把列表的每个字符串逐个赋值给VARIABLE表示的变量

例:

 for username in usera userb userc used;do
     useradd $username
     echo "Add $username finished"
done


//此循环的进入条件是list不为空

//推出条件是list遍历结束,即添加完userc用户


练习:请添加10个用户

#!/bin/bash
#添加10个用户
for username in user1 user2 user3 user4 user5 user6 user7 user8 user9 user10;do
    useradd $username
    echo "Add $username finished"
done

linux学习之shell的流程控制

linux学习之shell的流程控制




2、LIST的生成方法:

 1)、整数列表:

  a)、{start..end}//生成指定开始和结束段的整数表

  b)、$(seq [start [step]] end)//生成指定开始并以step(一个步进值)步进到结束值的数值表

例:

linux学习之shell的流程控制

linux学习之shell的流程控制




 2)、直接给出列表


 3)、glob

例:

linux学习之shell的流程控制



 4)、命令生成

例:

[[email protected] ~]# bash a.sh
root primary group: root
bin primary group: bin
daemon primary group: daemon
adm primary group: adm
lp primary group: lp
sync primary group: root
shutdown primary group: root
halt primary group: root
mail primary group: mail
uucp primary group: uucp
operator primary group: root
games primary group: users
gopher primary group: gopher
ftp primary group: ftp
nobody primary group: nobody
dbus primary group: dbus
usbmuxd primary group: usbmuxd
vcsa primary group: vcsa
rpc primary group: rpc
rtkit primary group: rtkit
avahi-autoipd primary group: avahi-autoipd
abrt primary group: abrt
rpcuser primary group: rpcuser
nfsnobody primary group: nfsnobody
haldaemon primary group: haldaemon
gdm primary group: gdm
ntp primary group: ntp
saslauth primary group: saslauth
postfix primary group: postfix
apache primary group: apache
pulse primary group: pulse
webalizer primary group: webalizer
tomcat primary group: tomcat
sshd primary group: sshd
tcpdump primary group: tcpdump
usera primary group: usera
userb primary group: userb
userc primary group: userc
hadoop primary group: hadoop
usertest primary group: usertest
testuser1 primary group: testuser1
named primary group: named
user1 primary group: user1
user2 primary group: user2
user3 primary group: user3
user4 primary group: user4
user5 primary group: user5
user6 primary group: user6
user7 primary group: user7
user8 primary group: user8
user9 primary group: user9
user10 primary group: user10
[[email protected] ~]#

linux学习之shell的流程控制


3、算术运算符


  + - * / % **(次方)

  数值的几种运算方式


  (1) $[$A+$B]

  (2) $(($A+$B))

  (3) let VARIABLE=$A+$B

  (4) VARIABLE=$(expr $A + $B)


例:求100以内的所有正整数的和

#!/bin/bash
#求100以内正整数的和
let sum=0
for i in {1..100};do
    sum=$[$sum+$i]
done
    echo "100以内正整数的和是:$sum"

linux学习之shell的流程控制


4、增强型赋值


 即表示变量通过加减1或者乘除自己的值来改变

 += -+ *= /= 等

 如 let num++  表示在num这边变量的数值上加1,然后将运算后得到的数值在赋个num

 let num++ 等效 let num=$[$num+1]

 例:

#!/bin/bash
#显示etc目录下所有普通文件的列表,然后统计个数
declare -i count=0
for file in /etc/*; do
 if [ -f $file ]; then
let count++
echo "$count $file"
 fi
done
echo "Total: $count files."

linux学习之shell的流程控制

linux学习之shell的流程控制


5、测试表达式

 

 整数测试

 字符串测试

 注意:

  (1) 字符串等会比较测试:[ "$hostname" == 'localhost'  ]

  (2) 模式匹配测试:[[ "STRING" =~ PATTERN ]]

 //表示左侧的字符串能否被右侧的模式匹配 必须使用在双中括号中且前后有空格

  (3) 与的优先级高于或的优先级


 组合测试条件:

条件间逻辑运算:

        与:多个条件要同时满足;

或:多个条件满足其一即可;

非:对指定的条件取反;

 

 表达式组合:

与:` CONDITION1 -a CONDITION2 `

或:` CONDITION1 -o CONDITION2 `

非:[ ! CONDITION ]


 命令组合:

与:COMMAND1 && COMMAND2  <-- [ EXPR1 ] && [ EXPR2 ] 

或:COMMAND1 || COMMAND2

非:! COMMAND


        短路操作符:&&

   false && true = false

   false && false = false

   true && false = true

   true && true = true


                 if COMMAND1; then

     COMMAND2

          fi

//满足COMMAND1执行COMMAND2


        短路操作符:||

   rue || true = true

   true || false = true

   false || true = true

   false || false = false


   if ! COMMAND1; then

COMMAND2

   fi

//满足COMMAND1执行COMMAND2


   COMMAND1 && COMMAND2 || COMMAND3

//表示满足COMMAND1就执行COMMAND2 否则执行COMMAND3

linux学习之shell的流程控制



6、多分支if语句


 单分支:

if CONDITION; then

 if-true-分支

fi

 双分支:

if CONDITION; then

  if-true-分支

else

  if-false-分支

fi

 多分支:

if CONDITION1; then

  if-CONDITION1-true-分支

elif CONDTION2; then

  if-CONDITIO2-true-分支

...

else

  if-ALL-false-分支

fi


此处写一个if多分支的例子

linux学习之shell的流程控制

linux学习之shell的流程控制



7、case语句

   case语句属于多分支语句

用法:

case $VARIABLE in

PATTERN1)

    分支1

    ;;

PATTERN2)

    分支2

    ;;

PATTERN3)

    分支3

    ;;

...

PATTERNn)

    分支n

    ;;

esac


//变量满足那个PATTERN就执行相应的分支


PATTERN可使用glob模式的通配符:

*: 任意长度的任意字符;

?: 任意单个字符;

[]: 指定范围内的任意单个字符;

a|b: 多选1;

linux学习之shell的流程控制

8、while循环

 用法

 while CONDITION;do

    循环体

 done


该循环需要先判断是否符合进入循环体的条件;不满足则不能进入或者退出循环


示例:求100以内所有正整数之和;

#!/bin/bash
#
declare -i sum=0
declare -i i=1
while [ $i -le 100 ]; do
let sum+=$i
let i++
one
echo "Sum: $sum."



9、until循环

用法

until CONDITION; do

 循环体

 循环控制变量的修正表达式

done

次处的进入进入和退出条件就跟while的完全相反了, CONDITION为假时进入循环,为真则不能进入或者退出循环

示例:求100以内所有正整数之和

#!/bin/bash
#
declare -i sum=0
declare -i i=1
until [ $i -gt 100 ]; do
    let sum+=$i
    let i++
done
echo "Sum: $sum."


10、循环控制

 在while等语句中会用到continue和break两个来控制循环

 如需提前结束本轮循环,直接进入下一轮循环使用continue

 如需提前结束循环,则使用break


linux学习之shell的流程控制



11、死循环

表示一直能满足循环的条件,将会一直执行循环体

while true; do

    循环体

 if CONDTION; then

    break

 fi

done


until false; do

     循环体

  if CONDITION; then

     break

  fi

done

linux学习之shell的流程控制



12、while循环的特殊用法:

遍历文件的每一行:

while read VARIABLE; do

循环体

done < /PATH/FROM/SOME_FILE

事例


13、使用for循环打印99乘法表

linux学习之shell的流程控制





ⅲ、函数

函数就是实现某种功能的方法,调用函数就是调用方法,

函数必须先定义后调用

 定义方法:

 (1)  

      function f_name {

                   函数体

                      }


(2)

  f_name() {

        函数体

           }

调用函数:

f_name [argu1, argu2, ...]


自定义函数状态返回值:

return [#]

0: 成功

1-255:失败

 注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;


通过函数的方式有助于提升编程效率,实现模块化编程