天天看点

shell编程

   说到shell编程之前,先介绍变量,变量在shell编程中是很重要。变量无非就是一堆可变化的值。

   变量的的声明遵循以下几条规则:

   一,不能跟系统中的变量名重名。如PATH是系统变量,在声明时不要也用PATH当作变量名。

   二,不能以数字开关,12USER=bingo这是错误的,最前面不是数字的话,就认为合法,当然变量名只有二种情况,要么全部是英文,要么是英文跟数字组合。等号的两边不能有空格,USERNAME= bingo这种情况声明的USERNAME是空值,且会把bingo当作命令来执行 ,USERNAME = bingo 这种情况会USERNAME当作命令来执行 ,USERNAME =bingo这种情况会USERNAME当作命令来执行。

   三,变量内容没有限制,如果变量内容里还有变量,则必须用双引号,不能会出现变量无法替换,如果变量内容有特殊字符则需用\这个跳脱字符将它原来的意义给注释掉,使它变成一个普通的字符来使用。

   四,取消变量用unset,如unset USERNAME.

对变量做基本的介绍下面介绍三种条件测试

(1) test expresstion :用于检查文件与比较有效值 

(2) [ expreesstion ](判断符号):与test作用一样,在脚本中这种写法很常见

(3) ` expresstion `:一般判断常数之间的大小

(4)命令执行有两种状态:一种叫做命令执行的结果,一种是命令执行结果的状态返回值,

<a href="http://blog.51cto.com/attachment/201206/175023548.jpg" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201206/175449726.jpg" target="_blank"></a>

(5)命令的引用两种方式``与$(): echo “kernel-`uname -r`" 与echo "kernel-$(uname -r)”。(``反单号,在esc键的下面)效果都一样

(6)算术运算:sum=$(($var1+$var2))与sum=$[$var1+$var2]效果一样

(7)位置参数:执行脚本为$0这个变量,第一个接的参数是$1,第二个是$2,依次累推

<a href="http://blog.51cto.com/attachment/201206/195028509.jpg" target="_blank"></a>

下面介绍if的用法。if 用于条件判断。

1,  if 条件测试 ;then

     语句...

    fi (表示结束if语句)

  (1) if test 2 -lt 3;then

         echo "this is right."

  fi

  (2)if [ 2 -lt 3 ];then (注意要与[  ]之间有空格

        echo "this is right"

   fi

(3)  if [[ 2&lt;3 ]];then

        echo “this is right”

    fi

2,if 条件测试;then(如果条件测试返回的值为真,则执行语句一,否则执行语句二)

      语句一....

    else

      语句二....

(1)if  [ 4 -lt 3 ];then 

      echo "this is right."

else  

       echo "this is wrong."

fi

(2) if id root &amp;&gt; /dev/null;then(if后面可以写命令,&amp;&gt; /dev/null把id命令执行的执行结果输入到/dev/null,可把/dev/null当作黑洞,永远都填不满)

          echo "user exist."

     else

          echo "user not exist."

3,  if 条件测试1;then

       语句一...

    elif 条件测试2;then (elif可以有多个)

       语句二...

        语句三...

   read -p “please input (y/n):." yn(提示用户输入y/n,并将值存储在变量yn中)

     if  [ "$yn" = "y" -o "$yn" == "Y" ];then

        echo "ok,continue"

    elif [ "$yn"= "n"  -o "$yn"="N" ];then

        echo "break."

          echo "input error."

4, case常用于变量的值有多种的时候

case  变量名 in 

 "第一个变量内容")

      语句1....

"第二变量内容”)

     语句2....

*)  (*表示既不是第一个变量内容也不是第二变量内容)

      语句3.....

esac

case "$1" in($1是位置参数,

start)

       service network start;; 

stop)

      service network stop;;

reload)

      sevice network reload;;

restart)

      service network restart;;

*)

echo "Usage: `basename $0` {start|stop|reload|restart}";;

5,for循环,一般用于知道要循环几次。

for 变量名  in  变量值 ;do

   语句1....

done

sum=0

for i in `seq 1 100`;do(seq 是表示从1到100都循环一次,加``表示先执行seq,得到seq命执行结果)

     sum=$(($i+$sum))

     let  i++ (让变量自动加1)

echo "total $sum."

6,while 循环用于变量值不固定的时

while 条件判断;do(条件满足时就循环)

   语句...

 计算从1到100偶数之和

i=0

while [ $i -le 100 ];do

      sum=$(($sum+$i))

      let i+=2

echo "total $sum"

7,until 循环正好与while相反,当条件不满足时循环

until 条件判断 do;

    语句

until [ $i -ge 100 ];do

     sum=$(($sum+$i)

     let i++

8,function(函数):简单来说实现代码重复调用。遵循先定义后调用

定义函数两种方式

(1)function fname {

语句.....

}(function 是关键字,fname是函数名

(2) fname () {

语句...

FUSER () {

    if id $1 &amp;&gt; /dev/null;then

         echo "user uid: `id -u $1`,user shell:`grep "^$1\&gt;:" /etc/passwd`

    esle

         echo "no this user."

}(定义了一个FUSER是函数名,大小写都无所谓)

read -p "input user:" USERNAME

while [ "$USERNAME" != "quit" ];do

      FUSER $USERNAME(给函数传递参数也就是$1)

      read -p "next user:" USERNAME

 done

9, continue:退出当前这一次循环,提前进入下一次循环

  i=0

  sum=0

      if [ $[$%2] -eq 1 ];then

      let i++

     continue (如果i是奇数,则又从while开始循环)

      fi

      let sum=$(($sum+$i))

echo "even total: $sum"

10, break: 中断当前循环

read -p "input username:" UNAME

while true;do(true表示不用做判断,开始循环)

    if id $UNAME &amp;&gt; /dev/null;then

          echo “user uid: `id -u $UNAME &amp;&gt; /dev/null`

           echo "no a user: $UNAME."

     fi

     read -p "n|N for next user,others for quitting."choice

           case $choice in 

             n|N)

                read -p "a username:" UNAME;;

             *)

                 break ;;(中止循环,并退出)

            esac

    done

本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/900301,如需转载请自行联系原作者