zoukankan      html  css  js  c++  java
  • linux shell 编程

    一、Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义:

    可以通过脚本测试来区分这几个变量的具体作用和用法.

    脚本如下:

    # vim variable
    #!/bin/sh
    echo "number:$#"
    echo "scname:$0"
    echo "first :$1"
    echo "second:$2"
    echo "argume:$@"
    echo "show parm list:$*"
    echo "show process id:$$"
    echo "show precomm stat: $?"
    
    :wq
    

    赋予脚本执行权限

    # chmod +x variable
    

    执行脚本

    # ./variable aa bb
    number:2
    scname:./variable
    first:aa
    second:bb
    argume:aa bb
    show parm list:aa bb
    show process id:24544
    show precomm stat:0
    

    通过显示结果可以看到:

    $# 是传给脚本的参数个数
    $0 是脚本本身的名字
    $1 是传递给该shell脚本的第一个参数
    $2 是传递给该shell脚本的第二个参数
    $@ 是传给脚本的所有参数的列表
    $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
    $$ 是脚本运行的当前进程ID号
    $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
    ############################################################################

    二.linux shell 之read -p 用法

    shell下的read命令的作用是从标准流中读取输入,并把读取的内容放到某个变量中。

    #!/bin/bash
    echo -e "Please enter your test :"
    read TESTREAD
    echo $TESTREAD
    
    ##########################################
    实例2
    #!/bin/bash
    mum=$1
    mum=${mum:-3}            #变量替换##当$mum的值大于或等于3后,就执行else后面的.
    if [ $mum = "1" ];then
    echo "测试环境 ..."
    elif [ $mum = "2" ];then
    echo "生产环境"
    else
    echo "请输入1或2,或单击enter键…"
    fi
    echo -e "33[35m --------- 你输入的是数字$mum!!!$in 33[39;49;0m"
    echo  "  press    any  key to continue "                 # 提示按任意键继续...
    read key                           
    

     三、SHELL学习笔记之循环语句之for和while  

    循环语句:for  while
      1.)for循环语句是在知道循环次数时使用.
      2.)while循环语句是在不知道循环次数时使用,使变量增加1的操作可以写成"let,i++"或expr变量1运算符变量

    for循环结构:

    for 变量名 in 取值列表                           
     do                                              
     命令序列                                        
     done        
    

    while循环结构:

    while   条件测试命令
     do
     命令序列
    done
    

    for 循环实例:

    [root@localhost source]# more for.sh
    #!/bin/bash
    for((i=1;i<10;i++)) 
    do 
    echo $i 
    done  
    或着(两种方式执行的结果是一样的)。
    #!/bin/bash
    for i in `seq 10`
    do
    echo $i  
    done
    执行结果:
    [root@localhost source]# sh for.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    例2:for循环之创建用户脚本:
    #!/bin/bash
    for i in {1...10}
     do
     useradd studet$i
     echo password | passwd --stdin studet$i
     done
    for 循环实例
    1 #!/bin/bash
    2 for i in `rpm -qa |grep httpd|awk '{print $1}'`
    3 do 
    4 
    5   /bin/echo $i
    6   /bin/echo start .....uninstall...
    7   rpm -e --nodeps $i 
    8   echo $i uninstall sucess...
    9 done
    批量卸载rpm安装包

    从文件hosts文件中过滤出ip地址,然后通过ansible执行ping命令,测试连通性.

    hosts文件格式入下:

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    ######################################
    10.100.2.136  v01-app-01
    10.100.2.82   v01-app-boss-web01

    执行脚本:

    #!/bin/bash
    
    for line in $(cat hosts |awk '{print $1}' |grep -v ^$ |grep -v ^# |grep -v '::1')
    do
     #echo $line
     if ping -c 1 $line >& /dev/null
       then
         #echo "$line: OK" >>pingok.log
         echo "$line: OK" |tee -a pingok.log
     else
         #echo "$line: Failed" >> pingfaild.log
         echo "$line: Failed" |tee -a pingfaild.log
      fi
    done

    while循环实例:

    while循环实例:
     #!/bin/sh
     echo "Please input the num:"
     read num
     sum=0
     i=1
     signal=0
     while [[ $signal != 1 ]]
     do
     if [ $i -eq $num ]
     then
     let "signal=1"
     let "sum+=i"
     echo "1+2、、、+$num=$sum"
     else
     let "sum=sum+i"
     let "i++"
     fi
     done
    实例2:while循环...
     #!/bin/bash
    checkdays=7
    while [ $checkdays -ge 4 ]
    do
            rq=`date +%Y-%m-%d --date="$checkdays days ago"`
            [ -f /usr/local/tomcat7/logs/localhost.$rq.log ] && {
            tar zcf localhost.$rq.log.tar.gz localhost.$rq.log
            }
            let checkdays-=1                    ####属于递减的循环...
    done
    执行后结果如下:
     [root@localhost ~]# sh -x 000.sh
    + checkdays=7
    + '[' 7 -ge 4 ']'
    ++ date +%Y-%m-%d '--date=7 days ago'
    + rq=2014-07-24
    + '[' -f /usr/local/tomcat7/logs/localhost.2014-07-24.log ']'
    + let checkdays-=1
    + '[' 6 -ge 4 ']'
    ++ date +%Y-%m-%d '--date=6 days ago'
    + rq=2014-07-25
    + '[' -f /usr/local/tomcat7/logs/localhost.2014-07-25.log ']'
    + let checkdays-=1
    + '[' 5 -ge 4 ']'
    ++ date +%Y-%m-%d '--date=5 days ago'
    + rq=2014-07-26
    + '[' -f /usr/local/tomcat7/logs/localhost.2014-07-26.log ']'
    + let checkdays-=1
    + '[' 4 -ge 4 ']'
    ++ date +%Y-%m-%d '--date=4 days ago'
    + rq=2014-07-27
    + '[' -f /usr/local/tomcat7/logs/localhost.2014-07-27.log ']'
    + let checkdays-=1
    + '[' 3 -ge 4 ']'
    [root@localhost ~]#
    while循环实例

    while read循环实例:

    $ cat host 
    192.168.1.10 root 123456
    192.168.1.20 root 123456
    192.168.1.30 root 123456
    
    $ cat while.sh 
    
    #!/bin/bash
    while read file
    do 
      echo $file
    done < host
    top -n1b > topinfo.txt
    
    #!/bin/bash
    cat /tmp/topinfo.txt | while read line
    do
    echo $line
    done
    按行读取文件内容
    #!/bin/bash
    
    paste -d :  1.txt 2.txt > 3.txt
    
    
    awk -F ":" '{print $2,$4}' 3.txt |while read h1 h2
    
    do 
      result=$((h1-h2))
      [ ! -z $h2 ] && echo "$h1 - $h2的值为--->: " $result
    
    done
    
    #将文件合并后取出$2和$4进行减法比较

    四、SHELL学习笔记之条件判断语句 if

    条件判断语句:if

    if  条件测试命令
      then
          命令序列1
      else
          命令序列2
      fi  

     实例:

    #!/bin/bash
    #install nginx-1.10.2
    if [ ! -d /usr/local/src ];then
      echo "not dircetry!!"
    else
      echo "is this dirctroy"
    fi

    实例2:

    检查进程是否存活脚本:

    #!/bin/bash
    #rinetd pid check
    
    pid=`ps -ef |grep rinetd |grep -v grep`
    
    if [ $? -ne 0 ]
    then
      rinetd -c /etc/rinetd.conf
      echo "Start executive time:"`date`
    else
    
      echo rinetd pid is running...
      echo date is :`date`
    fi
    ~
    $? -ne 0 表示不存在
    $? -eq 0 存在
    判断pid进程是否存在

    2.多重条件判断语句:if/else

    if [ 条件测试命令 ];
    then 
        命令序列1
    elif [ 条件测试命令 ];
        then 命令序列2
    elif [ 条件测试命令 ];
       then 命令序列3
    else
       命令序列4
    fi
    

     实例:

    #!/bin/bash
    system=`uname -s`
    if [ $system="linux" ];then
    echo "linux"
    elif [ $system="windows" ];then
    echo "windows"
    elif [ $system="solaris" ];then
    echo "solaris"
    else
    echo "what??"
    fi
    语句判断系统是那种类型的操作系统

    1.整数判断

     -eq 等于,如:if [ "$a" -eq "$b" ]
        -ne 不等于,如:if [ "$a" -ne "$b" ]
        -gt 大于,如:if [ "$a" -gt "$b" ]
        -ge 大于等于,如:if [ "$a" -ge "$b" ]
        -lt 小于,如:if [ "$a" -lt "$b" ]
        -le 小于等于,如:if [ "$a" -le "$b" ]
         大于(需要双括号),如:(("$a" > "$b"))
         >= 大于等于(需要双括号),如:(("$a" >= "$b"))
        小数据比较可使用AWK
    

    2. 文件的判断

    -r file     用户可读为真
     -w file     用户可写为真
     -x file     用户可执行为真
     -f file     文件为正规文件为真
     -d file     文件为目录为真
     -c file     文件为字符特殊文件为真
     -b file     文件为块特殊文件为真
     -s file     文件大小非0时为真
     -t file     当文件描述符(默认为1)指定的设备为终端时为真
    [ -f "somefile" ] :判断是否是一个文件
    [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
    [ -n "$var" ] :判断$var变量是否有值
    [ "$a" = "$b" ] :判断$a和$b是否相等
    

    文件测试

    -e     filename      文件是否存在
    -f     filename       否是是普通文件
    -d     --                是否为目录
    -i      --                是否为链接文件
    -r      --               是否为可读文件
    -w     --               是否为可写文件
    -x     --               是否为可执行文件
    -z     --               是否为空.
    组合条件
    !:取反
    -a:与条件
    -o: 或条件
    范例:
    1.检查mytesl是否存在,如果不存在则创建的两种写法.
    [ -e /tmp/mytest ] || mkdir /tmp/mytest
    [ ! -e /tmp/mytest ] && mkdir /tmp/mytest
    2.如果这个文件可执行,将启动该文件.
    [ -x /etc/init.d/network ] && /etc/init.d/network start
    3.如果/bin/hostname 存在,我们就将他的执行结果给变量MYHOSTNAME.
    [ -x /bin/hostname ] && MYHOSTNAME=`/bin/hostname`     

    3.复杂逻辑判断

    -a           与
    -o        或
     !         非
    

    4.字符串判断

    str1 = str2      当两个串有相同内容、长度时为真
    str1 != str2      当串str1和str2不等时为真
    -n str1        当串的长度大于0时为真(串非空)
    -z str1        当串的长度为0时为真(空串)
    str1           当串str1为非空时为真
    

     五、SHELL学习笔记之多分支语句-case  

    多分支语句:case  多分支if语句通常可以修改为case语句.

    case $变量名 in
                    模式1)
                命令序列1
                ;;
                    模式2)
                命令序列2
             ;; 
                    *)
                默认执行的命令序列     ;; 
                esac 
    

    2. case语句结构特点如下:

    case行尾必须为单词“in”,每一个模式必须以右括号“)”结束。

         双分号“;;”表示命令序列结束。

         匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。

         最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后 的命令序列。

    3.case语句实例:

    1.)由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符,并输出相应的提示信息。

    #!/bin/bash
    read -p "press some key ,then press return :" KEY
    case $KEY in
    [a-z]|[A-Z])
    echo "It's a letter."
    ;;
    [0-9]) 
    echo "It's a digit."
    ;;
    *)
    echo "It's function keys、Spacebar or other ksys."
    esac
    

    2.)许多的daemon都会附上一个管理用的Shell Script,Apache就附上apachectl。这些管理程式都是用shell script来写的,以下示一个管理inetd的shell script。

    #!/bin/sh
    
     case $1 in
         start | begin | commence)
            /usr/sbin/inetd
         ;;
         stop | end | destroy)
            killall inetd
         ;;
         restart | again)
            killall -HUP inetd
         ;;
         *)
            echo "usage: inetpanel [start | begin | commence | stop | end | destory | restart | again]"
         ;;
     esac
    

    例如利用case来写一个解压war包的脚本.

    #more initjar.sh
    #!/bin/bash
    #############################
    
    
    #############################
    DDIR=~/sources
    PROJECT=$1
    PWD=`pwd`
    DCONF=~/$PROJECT/WEB-INF/classes
    
    case $1 in
            fore)
                    test ! -d ~/$PROJECT && mkdir ~/$PROJECT
                    cd ~/$PROJECT && rm  -rf ./*
                    jar -xf $DDIR/$PROJECT.war
                    cat $DCONF/server.properties.online >$DCONF/server.properties
                    cat $DCONF/database.properties.online >$DCONF/database.properties
                    cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties
                    cat $DCONF/../web.xml.online >$DCONF/../web.xml
                    ;;
    
            eten)
                    test ! -d ~/$PROJECT && mkdir ~/$PROJECT
                    cd ~/$PROJECT  && rm -rf ./*
                    jar -xf $DDIR/$PROJECT.war
                    cat $DCONF/server.properties.online >$DCONF/server.properties
                    cat $DCONF/database.properties.online >$DCONF/database.properties
                    #cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties
                    ;;
            pp-bms)
                    test ! -d ~/$PROJECT && mkdir ~/$PROJECT
                    cd ~/$PROJECT  && rm -rf ./*
                    jar -xf $DDIR/$PROJECT.war
                    cat $DCONF/server.properties.online >$DCONF/server.properties
                    cat $DCONF/database.properties.online >$DCONF/database.properties
                    #cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties
                    ;;
            *)
                   echo $"Usage: $0 {fore|eten|pp-bms|passport|pp-web2|toloan|report|app}"
                    RETVAL=2
                    ;;
    esac
    exit $RETVAL
    

    利用case写的一个备份脚本.

    #more backup.sh
    #!/bin/bash
    ##############################
    # discrition: backup project  of  tomcat by Manual
    # example:  ~/bin/backup.sh fore
    # write by frank at 2014/03/11
    ##############################
    
    BAK_DIR=/apps/product/backup
    ETEN_DIR=/apps/product/tomcat_eten/webapps/eten
    FORE_DIR=/apps/product/nginx/htdocs/p2ptomcat/fore
    BMS=/apps/product/tomcat_eten/webapps/pp-bms
    DAY_DIR=`date +%Y%m%d`
    TIME=`date +%Y%m%d%H%M`
    
    
    mkdir -p ${BAK_DIR}/${DAY_DIR}
    case  $1 in
            eten)
                    cd  $BAK_DIR
                    cp -a $ETEN_DIR $BAK_DIR
                    tar -czf $1.$TIME.tgz  $1 && rm  -rf $1
                    mv $1.$TIME.tgz $DAY_DIR/
                    exit 0
                    ;;
            fore)
                    cd  $BAK_DIR
                    cp -a $FORE_DIR $BAK_DIR
                    tar -czf $1.$TIME.tgz  $1 && rm  -rf $1
                    mv $1.$TIME.tgz $DAY_DIR/
                    exit 0
                    ;;
            pp-bms)
                    cd  $BAK_DIR
                    cp -a $BMS $BAK_DIR
                    tar -czf $1.$TIME.tgz  $1 && rm  -rf $1
                    mv $1.$TIME.tgz $DAY_DIR/
                    exit 0
                    ;;
            *)
                    echo "$0 {eten|fore|pp-bms}"
                    exit 2
                    ;;
    esac
    

    参考文档:http://blog.sina.com.cn/s/blog_af6bb6bc0102uwb9.html

  • 相关阅读:
    RK3288 GMAC整理
    Linux电源管理-Linux regulator framework概述
    SRAM、DRAM、SDRAM、DDR、DDR2、DDR3
    内核错误值
    module_param和module_param_array用法
    VGA
    如何获取显示器的EDID信息
    进程间通信--共享内存
    Java 中的 CAS 简述及原理解析
    volatile 关键字特性解析及单例模式下的使用
  • 原文地址:https://www.cnblogs.com/saneri/p/6692884.html
Copyright © 2011-2022 走看看