Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397426
  • 博文数量: 58
  • 博客积分: 1775
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-12 15:03
文章分类

全部博文(58)

文章存档

2012年(5)

2011年(43)

2010年(10)

分类: LINUX

2011-11-07 23:22:06

一、Shell变量 主要有本地变量和环境变量。
        1、本地变量  -- 在用户现有运行的脚本中使用
              1) 定义本地变量      格式: variable-name=value
                  例子:[root@jike1 /root]# LOCALTEST="test"
                           [root@jike1 /root]# echo $LOCALTEST            (注意:echo $LOCALTEST 和 echo ${LOCALTEST}的效果是一样的)
                  (在变量名前加$, 可以取得此变量的值,使用echo命令可以显示变量的值)
              2) 显示本地变量      格式: set
                  例子:[root@chinaitlab root]# set
              3) 清除本地变量     格式:unset  variable-name
                  例如:[root@jike1 /root]# unset LOCALTEST
                  此时再执行echo $LOCALTEST将看不到变量LOCALTEST的输出。
                           
        2、环境变量 -- 在所有的子进程中使用
              1) 定义环境变量     格式: export  variable-name=value (与本地变量的定义相比,多了一个export关键字)
                  例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
                              [root@ chinaitlab shell]# vi testenv.sh
                                #!/bin/bash                        #表示用bash来解析脚本
                                #testenv.sh

                                echo $DOMAIN
                              [root@chinaitlab shell]# chmod +x testenv.sh
                              [root@chinaitlab shell]# ./testenv.sh
                                chinaitlab.com
                2) 显示环境变量     格式: env     (本地变量的显示使用set,环境变量的显示使用env)
                    例子: [root@chinaitlab test]# env
                3) 清除环境变量     格式:unset  variable-name     (用法与本地变量相同,都使用unset)
                    例子: [root@chinaitlab shell]# unset DOMAIN
                    此时再执行./testenv.sh将看不到变量DOMAIN的输出。   
        3、其它变量
              1) 位置变量     $0,$1,$2,$3……$9
              2) 只读变量  readonly variable
                  注意:只读变量不能被清除和改变其值,所以要谨慎使用。
              3) 特殊变量     $#,$?,$$(表示当前进程的PID)……
二、运算符和表达式
        
        1、运算符是对计算机发的指令,运算符类型有:
                算术运算符(+、-、*、/)
                按位运算符(~、>、&、|、^)
                逻辑运算符(&&、||、 > 、= = 、>=)
        
        2、表达式是运算符和运算对象的组合体。
                1) $[]:可以接受不同基数的数字的表达式
                    echo $[10+1]                            (输出:11)
                    echo "$[2+3],$HOME"            (输出:5,/root)
                    echo $[2>1]            (输出:16,4)   
                    echo $[2>3],$[3>2]                (输出:0,1 表达式为false时输出0,为true时输出1
                2) 字符表达式:直接书写,采用单引号,双引号引起来。
                    echo " $HOME,That is your root directory."     (输出:/root,That is your root directory.)
                    echo ' $HOME,That is your root directory. '     (输出:$HOME,That is your root directory.)
                    单引号和双引号的区别在于:单引号是原样显示,双引号则显示出变量的值。
                3) test表达式
三、控制结构
        1、if语句
              例:  #!/bin/bash
                      #if.sh
                      if [ "10" -lt "12" ]            #注意:if和[之间,[和"10"之间,"12"和]都有空格,如果不加空格,会出现语法错误
                      then
                      echo "Yes,10 is less than 12"
                      fi
        2、case语句
              例:  #!/bin/bash
                      #case.sh
                      echo -n "Enter a start or stop:"
                      read ANS
                      case $ANS in
                      start)
                           echo "You select start"
                           ;;
                      stop)
                           echo "You select stop"
                           ;;
                      *)
                           echo "`basename $0`: You select is not between start and stop" >&2            
                           #注意:>和&2之间没有空格,>&2 表示将显示输出到标准输出(一般是屏幕)上
                           exit;
                           ;;
                      esac
        3、for循环语句
              格式:   for 变量名 in 列表
                          do
                              命令1
                              命令2
                              ... ...
                          done
        4、until循环语句
              格式:   until 条件
                          do
                              命令1
                              命令2
                              ... ...
                          done
        5、while循环语句
              格式:   while 命令
                          do
                              命令1
                          break
                              命令2
                          continue
                              命令3
                              ... ...
                          done
四、输入输出

        1、几个重要的工具
              1) echo
                  例:echo -n "Enter a number from 1 to 2:"    (-n 表示不换行,此时光标停留在行尾)
              2) read
                  例:read ANS     (表示将用户的输入存放到变量ANS中)
              3) cat    (显示文件内容)
              4) 管道( | )    (一个程序的输出作为另一个程序的输入)
                  例:ls -l | grep "d"
              5) 文件重定向( >和>> )
                  例:ls -l > /tmp/a.txt    (将输出的结果重写到a.txt这个文件中)
                        ls -l >> /tmp/a.txt   (将输出的结果追加到a.txt这个文件中,常用于记录日志)
              6) 标准输入( $0 )、标准输出( $1 )和标准错误( $2 )
                  采用文件描述符($0、$1、$2)来定义。
        2、实例:readme.sh
                #!/bin/bash
                #readname.sh
                echo -n "First Name: "
                read firstname
                echo -n "Last Name: "
                read lastname subname
                echo -e "Your First Name is :${firstname}\n "             #加了-e表示将\n解析为转义字符
                echo -e "Your Last Name is :${lastname}\n "
                echo -e "Your Subname is :${subname}\n "
                echo "Your First Name is :${firstname}\n " >>firstname.txt        #这行没加-e,因此在输出中会原样显示\n
                echo  "Your Last Name is :${lastname}\n " >lastname.txt
                echo  "Your Subname is :${subname}\n " >&1
五、文本过滤

        1、正则表达式    (就是模式匹配)
        2、find    (查找文件)
              例:find ./ -name "*.txt" -print
        3、grep    (查找字符)
              例:grep "[5-8][6-9][0-3]" access_log
        4、awk    (把一系列数据分域,即分成列)
              例:awk '{print $1"\t"$4}' access_log
        5、sed    (对数据进行查找和替换)
              例:sed  -n 's/chinaitlab/hello/p' myfile.txt    (将myfile.txt文件中的chinaitlab替换成hello,并打印到屏幕上来,s表示替换,p表示打印。如果加上重定向符就可以将替换后的 内容输出到一个文件中去。)
        6、sort    (排序)
              例:sort ip.txt
        7、uniq    (显示这一列是唯一的还是不唯一的,可以唯一化)
              例:uniq ip.txt
        8、split    (可以对文件进行分割)
              例:split myfile.txt
        9、实例:kill_process.sh
                #!/bin/bash
                #kill_process.sh
                current_PID=$$
                ps -aux|grep "/usr/sbin/sshd"|grep -v "grep"|awk '{print $2}'>/tmp/${current_PID}.txt
                for pid in `cat /tmp/${current_PID}.txt`
                do
                {
                     echo "kill -9 $pid"
                     kill -9 $pid
                }
                done
                rm -f /tmp/${current_PID}.txt
六、Shell函数
        
1、定义函数有两种格式,分别为:
                函数名()
                {  
                     命令1
                     ... ...
                }
                function 函数名()
                {  
                     ... ...
                }
        2、实例:func.sh
                #!/bin/bash
                #func.sh
                # Source function library.            # /etc/rc.d/init.d/functions中存放了大量已经写好的函
                . /etc/rc.d/init.d/functions            # 引入/etc/rc.d/init.d/functions中的函数,相当于其它语言中的include
                function hello ()
                {  
                echo "Hello,$1 today is `date`"
                }
                echo "now going to the function hello"  
                hello chinaitlab
                echo "back from the function"
阅读(1607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~