Linux中的shell编程

shell变量

      1:两类变量:临时变量和永久变量

           临时变量是shell程序内部定义的,适用范围仅限于程序内部,对其他程序不可见。包括:用户自定义变量,位置变量。永久变量是环境变量,其值不随shell脚本的执行结束而消失。

      2:用户自定义变量要以字母或下划线开头,由字母,数字,下划线组成。在使用变量时,要在变量前面加"$"符号。

      3:位置变量和特殊变量

                   shell解释执行用户命令时,将执行命令的第一个部分作为命令名,其他部分作为参数。由出现在命令行上的位置确定的参数称为位置参数。

          例如:

                  ls  -l  file1 file2  file3

                $0这个程序的文件名 ls -l

                $n 这程序的第n个参数值,n=1-9

       4:特殊变量

               $*  这个程序的所有的参数

               $#   这个程序的参数的个数

               $$ 这个程序的PID

               $!  执行上一个后台命令的PID

                $?  执行上一个命令的返回值

       5:shell命令

            read命令:从键盘读入数据,付给变量。

           如:read  NAME

            expr命令:对整数型变量进行算数运算

           如:expr  3 + 5  之间要有空格否则以字符的形式表示出来

                  expr  $var1 / $var2   同上

                  expr  $var1 \* 10  乘法要用到转义字符"\"

            复杂的运算:expr  `expr 5 + 7` + 3   可以用命令替换符

       6:变量测试语句:

          test      测试条件

           1>字符串测试:

                      test  str1=str2   测试字符串是否相等

                      test  str1 != str2 测试字符串是否不相等

                      test   str1           测试字符串str1是否不为空

                      test    -n  str1      测试字符串是否不为空

                      test    -z   str1     测试字符串是否为空

            2>整数测试:

                      test   int1   -eq   int2  测试整数是否相等

                      test   int1   -ge    int2  测试int1是否>=int2

                      test   int1   -gt     int2   测试int1是否> int2

                      test   int1   -le     int2    测试int1是否 <= int2

                      test   int1   -lt     int2    测试int1是否< int2

                      test   int1    -ne   int2   测试int1和int2是否不相等

             3>文件测试:

                      test  -d  file  指定的问件是否为目录

                      test   -f file    指定的文件是否为常规的文件

                      test   -x file   指定的文件是否可执行

                      test   -r  file   指定的文件是否可读

                      test   -w  file   指定的文件是否可写

                      test   -a  file   指定的文件是否存在

                      test   -s  file    指定的文件大小是否非0

变量测试语句一般不单独使用,一般作为if语句的测试条件。

例如:

          if      test   -d   $1  then

          fi

变量测试语句可用[] 进行简化,如

test -d $1  等价于  [ -d $1 ] (注意括号两边的空格)

 

     7:流程控制语句

            多个条件的联合:

          -a   逻辑与,当且仅当两个条件都成立时,结果为真

         -o    逻辑或,两个条件只要有一个条件成立,结果为真。

       例如: elif [ -c $file_name -o -b $file_name ]   

                     then                                                     (注意测试语句内的空格)

      

        一个实际的例子:

                   #/bin/sh

                   if  [ $#  -ne 2 ]; then

                          echo  "Not enough parameters"

                          exit 0    #  0表示程序正常的退出

                   fi

                   if  [ $1 -eq $2 ]; then

                          echo "$1 equals $2"            #注意双引号和单引号的区别

                   elif  [ $1 -lt  $2 ]; then

                           echo  "$1 littler than $2"

                   elif  [ $1 -gt  $2 ]; then

                            echo "$1 greater than $2"

                    fi

        for ....done语句

                 例子:(剔除某一个在线的用户)

                 #!/bin/sh

                #the script to kill logined user

                    username="$1"

                    /bin/ps  aux |  /bin/grep $username | /bin/awk '{ print $2 }'  > /tmp/tmp.pid

                    killid = `cat /tmp/tmp.pid`

                    for PID in $killid

                    do

                            /bin/kill  -9  $PID 2> /dev/null

                    done

          select 和case的用法实例:

                  #!/bin/sh

                     echo "a is 5, b is 3. Please select your method:"

                      a=5

                      b=3

                     select var in "a+b"  "a-b"  "a*b"  "a/b"

                     do

                             break

                     done

                     case $var in 

                               "a+b")  echo 'a+b=' `expr $a "+" $b` ;;

                               "a-b" )  echo 'a-b=' `expr $a "-" $b` ;;

                               "a*b" )  echo 'a*b=' `expr $a "*" $b` ;;

                               "a/b"  )  echo 'a/b='  `expr $a "\" $b` ;;

                                 *  )  echo "input error"

                       esac         

         

               while 循环:

                       #!/bin/sh

                          num=1

                         while [ $num -le 10 ]

                                 do

                                      SUM= `expr $num \* $num`

                                      echo $SUM

                                       num= `expr $num +1 `

                                   done

不通过交互式的方法而是通过标准输入来设置用户的密码: echo "密码" |  passwd  --stdin  用户名

 

你可能感兴趣的:(Linux中的shell编程)