zoukankan      html  css  js  c++  java
  • Shell编程分述

    一、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<<3],$[8>>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"

     

  • 相关阅读:
    .net core项目iis10上出现 HTTP 错误 500.19,错误代码:0x8007000d
    redis安装
    【Docker】来自官方映像的 6 个 Dockerfile 技巧
    vi编辑器内上下左右健变ABCD的修复方法
    linux下安装ping命令
    Managing Chef Cookbooks the Berkshelf way
    chef学习杂记
    源代码与二进制异同
    chef 配置之 Templates
    shell ${}的使用
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/1540173.html
Copyright © 2011-2022 走看看