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

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/saneri/p/6692884.html
Copyright © 2011-2022 走看看