zoukankan      html  css  js  c++  java
  • shell语法快速入门(1)

    #得到绝对路径
    DIR=$(cd `dirname $0`;pwd)
    $DIR/file.txt
    #去掉#注释
    egrep -v "(#|^$)" /etc/zabbix/zabbix_server.conf
     
    基本语法:
    • export 变量=变量值    声明全局变量
    • unset $变量名  清空变量
    • read  -p "真的卸载?(yes|no)"  flag
    • 使用 read [-p "提示信息" ] 变量名 声明交互变量
    • 常见环境变量$USER $LOGNAME $UID $SHELL $HOME $PWD $PATH $PS1 $PS2
    • $n (n在1-9之间)位置变量
    • 预定义变量:
                         $#传递到当前脚本的参数的总个数,
                         $*以一个单字符串显示所有向脚本传递的参数,
                         $?上一条指令执行后返回的状态,
                         $$当前所在进程的进程号,$!后台运行的最后一个进程,
                         $0当前执行的进程程序名
    • 条件判定:
                        &&成功执行一个命令,再执行下一个命令    modprobe ppp-compress-18 && echo success
                        ||一个命令执行失败后再执行下一个命令
                        ()在一个子shell里执行的一组命令     {}在当前shell里执行一组命令,修改变量值立即起效
    • 多种括号的使用
                        ((  ))多用于计算表达式    [[   ]]  语法最兼容,逻辑判断    ()   优先级最高    [   ]  逻辑判断,兼容性不高
    • 运算    加`expr $1 + 2` 减  `expr $1 -2 `  除`expr $1 / 2`  
    • 常用文件判定
          -e文件存在               -f 文件是个普通文件        -s 文件大小不为零
          -d 文件是一个目录     -b 文件是一个块设备              -c 文件是一个字符设备
           -p 文件是一个管道       -h|-L 文件是一个符号链接       -s 文件是一个socket
           -t 文件与一个终端设备相关     -r 文件是否可读           -w 文件是否可写             -x 文件是否可执行
          f1 -nt f2 文件f1比f2新    f1 -ot f2 文件f1比f2旧    f1 –ef f2 文件f1与f2是相同文件的硬链接
    • 字符串判定
                -z 字符串为null          -n 字符串不为null
    • 数值判定
                -eq 等于     –ne不等于     –gt大于 
                –ge大于等于    –lt 小于         –le 小于等于 
    • 常用判定符
                =  != 可在[ ]中使用
                <  <=  >=  > 可在双括号内 [[ ]] 使用
    • 逻辑判定
                -a 逻辑与    -o 逻辑或
     
    条件判断if
     if [ $# = 0 ] ;then           // [ =  ]间有空格, then前有;号
        ...
    elif [  $a -lt 3 ];then
    ...
    fi
    多条件判断
        if [ -n $port1 ] && [ -n $port2 ] && [ -n $port3 ] && [ -n $port4 ] && [ -n $port5 ];then
        if [ -n $port1 ] || [ -n $port2 ] || [ -n $port3 ] || [ -n $port4 ] || [ -n $port5 ];then
    注意:如果if 的条件中包含字符串变量变量,请注意使用“”,如:if [ -z "$test" ];then
     
    条件判断case
    case  $letter   in
      U|u) whoami ; ;
      L|l) ls –l / ; ;
      E|e)exit ;;
      *) echo “please input true parm!!!” ; ;
    esac
     for 循环
     (使用return  0或1来退出循环)
    格式1:
      int j=0
       for i in $arr   //$arr为链表
       do
        echo "第$j次循环"
        j=`expr $j + 1`
       done
    格式2:
        for (( i = 0; i < $len ; i++ )) ; do
            echo "第$i次循环"
        done
     
     while循环
    (使用return  0或1来退出循环)
    格式:
      While [ $num  –lt  10  ]
      Do 
      Done
     
    sample1:
        while [ $# -ne 2 ]
        do
            echo "输出$#"
            sleep 1            //休息1s
            if [ $i -eq 100 ]
            then
            break //退出
            fi
            shift
        done
     
    until循环
     (使用return  0或1来退出循环)
      Util [ $num –lt 10 ]
      Do
      Done
     
    数组
    声明
    array[key]=value #array[0]=one,array[1]=two
    declare -a array   #array被当作数组名
    array=( value1 value2 value3 ... )
    array=( [1]=one [2]=two [3]=three )
    array="one two three" # echo ${array[0|@|*]}  把array变量当作数组来处理,但数组元素只有字符串元素本身
    访问
    ${array[key]}  #${array[1]}
    ${array[@|*]}    #输出所有元素
    ${array[@]:1}    #从第二(1+1)个元素开始,后面所有的元素
    ${array[@]:0:2} #从第一(0+1)个元素开始的两个元素
    ${array[@]:1:3}  #从第二个元素开始的三个元素
    ${#array}       #计算数组第一个元素的长度
    ${#array[0]}    #同上
    ${#array[*}}     #计算数组的个数
    ${#array[@]}     #同上
    删除
    unset array[1]  #删除数组中的第一个元素
    unset array #删除整个数组
    ${array[@]#t*e} #删除字符串左边开始最短的匹配t*e
    ${array[@]##t*e} #删除字符串左边开始最长的匹配t*e
    ${array[@]%o}   #删除字符串右边开始最短的匹配
    ${array[@]%%o}   #删除字符串右边开始最长的匹配
    字串替换
    ${array[@] /o/m} #数组中所有的o都会被替换为m
    ${array[@] /o/}    #所有匹配到的o都会被删除
    ${array[@] /#o/m}  #数组已o开头的匹配将会被替换
    ${array[@] /%o/m}  #数组已o结尾的匹配将会被替换
    sample排序
    bak_date_ns=(`cat $tmpfile1|awk -F "." '{print $1}'`)   //排序前
    bak_date=($(for val in "${bak_date_ns[@]}"  //排序后
            do
              echo "$val"
            done|sort)
           )
     
    函数
    使用函数的好处:可以将一组功能打包,在同一shell中,多次调用。
    函数的声明
    function chk_clientip() #检验client_ip参数
    {
             if_net_well=0
             cle_ip=$1
             client_ip=$2
             server_ip=$3
             if [ -n "$cle_ip" ]  &&  [ -n "$client_ip" ] && [ -n "$server_ip" ];then
        if_net_well=1
             fi
            return $if_net_well
    }
    函数的调用
    chk_clientip $cle_ip $client_ip $server_ip
    result=$?    //函数执行结果,返回的$if_net_well 的值
     
    正则表达式:
    ip地址 [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$
  • 相关阅读:
    字符转int 的几种方法
    递归在类中的写法
    修改多维才智的名字
    max中用 .net 判断输入的邮箱地址是否合格。
    找处场景中同名称的结点
    Android Button [ 学习笔记 一 ] 原创
    Android中Listview注意事项
    Android 移动开发一本就够学习笔记一
    ListActivity 学习[原创]
    在 Eclipse 中导入 Android 示例程序
  • 原文地址:https://www.cnblogs.com/janehoo/p/6113463.html
Copyright © 2011-2022 走看看