zoukankan      html  css  js  c++  java
  • SHELL编程基础01

    首先shell是在linux下运行的一种环境,它是以shell脚本来运行的,学会了它基本可以解决任何问题,也可以用shell脚本开发。

    和java,python的相比,其弱类型的语言没有那么复杂的结构,编程讲究习惯,写代码时也要遵循这个习惯,就像这个是老祖宗 定的规则一样

    shell脚本代码习惯

    我整理了一些大家当做参考:

      1   数字不加引号
        单引号表示字符串或者固定不变的字符
        其他都用双引号

      2     写脚本第一行加入#!/bin/bash           sh脚本的习惯(不要问什么)

    变量

      变量是存储的数据的方式

    只读变量

    #!/bin/sh
    NAME="nihaoma"
    readonly NAME
    NAME="wobuhaoa"

    这样变量会报错,因为设置了只读

    取消定义变量
      unset 变量名称

      

      

      如果变量没有被定义可以用echo ${变量名:-自定义内容} ,返回自定义内容。如果有定义返回变量值,此可判断变量没有定义,确保变量有值

      

      =,表示如果变量没有定义,直接给变量赋自定义的值

    变量的类型

      变量类型分为全局变量,局部变量和shell变量(shell自带的变量)

    shell特殊变量
      $0 获取文件当前的文件名 包括路径
      $n 获取当前执行shell脚本的第n个参数 n=1...9 如果n>9 用大括号 ${10}
      sh n.sh das 213d  
      脚本里面写 echo $1 $2 $3
      运行sh n.sh das 213d
      结果为das 213d 其对应的就是脚本后面的参数,$3没有>参数就没了

      $!  执行上一个指令的PID

      $*  获取当前shell的所有参数 $1 $2 $3   ...

      $# 执行命令行参数的总个数
      dirname $0 取全路径
      basename $0 取名称
      $? 对于上一个命令判断是否成功成功返回0
      2权限拒绝 1-125运行失败 126找到命令但是无法执行 127未找到该命令 >128命令被强制结束
      $$ 取进程号

      $@   这个程序的所有参数 $1 $2 $3

      $_    在此之前执行的命令或脚本的最后一个参数

    shift语句

      其按照如下方式重新命名所有位置参数变量,即$2成为$1,$3成为$2***在程序中每使用一次shift语句,都使所有的位置参数依次向移动一个位置,并使位置参数$#减1,直到减到0为止

    变量的获取

      

      ↑查看变量字符数   或者echo $a | wc -m

      

      ↑取第三个字符到结尾   也可以理解成删除前两个字符

       

      ↑取第三个字符总共两个 

      或者 echo ${a} |cut -c 3-4

      

      ↑从开头删除最短匹配的字符,##最长

       

      ↑从结尾删除最短匹配的,%%最长 

      ${变量/旧字符串/新字符串}   若变量内容符合“旧字符串”,则首个旧字符会被新字符替换

      ${变量/旧字符串//新字符串}   若变量内容符合“旧字符串”,则全部旧字符会被新字符替换

    批量文件名修改实战
      将下面文件用shell去除_strong
      chen_1995_1_2_strong.jpg
      chen_1995_1_3_strong.jpg
      chen_1995_1_4_strong.jpg
      chen_1995_1_5_strong.jpg

      1.首先造数据
        vi a.log ,将文件名复制进去
      2.写造数据的shell命令

    for f in `cat a.log`; 
    do `touch $f`;
    done

      3.写修改文件名的shell脚本
        vi aaa.sh

    for f in `ls *.jps` 
    do 
    mv $f `echo ${f%_strong*}.jpg`;
    done

      替换也是一样,批量改名

      

      rename     .JPG     .HTML    *.jpg
             原来的名称   改的名称  原来文件名

    shell计算方式

      普通计算

        

        

        

       命令行传参

         

      let计算

        

      expr 计算

        

        注意:中间要加空格否则不累加  乘号前面要加转义符,除号后面试了下可以不加

      bc 计算(支持小数)

         

        bc计算可以通过管道符也可以直接bc进入bc运算,最后试了下好像也不支持小数

    DATE时间获取

    #!/bin/bash
    YY=`date +%Y` #获取年
    echo $YY
    
    mm=`date +%m` #获取月
    echo $mm
    
    DD=`date +%d` #获取日
    echo $DD
    
    HH=`date +%H` #获取小时
    echo $HH
    
    MM=`date +%M` #获取分
    echo $MM
    
    dd=`date +%S` #获取秒
    echo $dd
    hello=$YY$mm$DD$HH$MM$dd
    echo $hello
    
    
    bigone=`date +%Y%m%d%H%M%S` #获取精确时间
    echo $bigone
    
    a=10
    b=10
    
    if [ $hello -eq $bigone ]
    then echo true
    else
    echo false
    
    fi

    if判断
      条件表达式
        [ aaaa ] -eq [ bbbb ] 中括号两边要带空格
        -eq 测试两个整数是否相等
        -ne 测试两个整数是否不等
        -gt 测试一个数是否大于另一个数
        -lt 测试一个数是否小于另一个数
        -ge 大于或等于
        -le 小于或等于

      组合测试条件
        -a: and
        -o: or
        !: 非

        逻辑与:&&
        第一个条件为假 第二个条件不用在判断,最总结果已经有
        第一个条件为真,第二个条件必须得判断
        逻辑或:||
        只要有一个条件为真,直接判断为真

      字符串比较
        == 等于 两边要有空格
        != 不等
        > 大于
        < 小于

      文件判断
        -z string 测试指定字符是否为空,空着真,非空为假
        -n string 测试指定字符串是否为不空,空为假 非空为真
        -e FILE 测试文件是否存在
        -f file 测试文件是否为普通文件
        -d file 测试指定路径是否为目录
        -r file 测试文件对当前用户是否可读
        -w file 测试文件对当前用户是否可写
        -x file 测试文件对当前用户是都可执行
        -z 是否为空 为空则为真
        -a 是否不空

    a="sadasdasd"
    if
    [ -z $a ];
    then echo kong
    else echo bukong
    fi

    if语法
      if 判断条件 0为真 其他都为假

      单分支if语句
        if 判断条件;then
        statement1
        statement2
        .......
        fi

      双分支的if语句
        复制代码
        if 判断条件;then
        statement1
        statement2
        .....
        else
        statement3
        statement4
        fi

      如下:

    read -p "please input your grade:" x
    declare -i x
    if [ "$x" == "" ];then
    echo "you must input the word in it"
    exit 5
    fi
    if
    [ $x -eq 100 ];then echo "你已经超神了"
    elif
    [ $x -ge 90 -a $x -le 99 ];then echo "变态杀戮"
    elif
    [ $x -ge 80 -a $x -le 89 ];then echo "大波kill"
    elif
    [ $x -ge 70 -a $x -le 79 ];then echo "one kill"
    elif
    [ $x -ge 60 -a $x -le 69 ];then echo "first brood"
    elif
    [ $x -ge 0 -a $x -le 59 ];then echo "对面已经超神了"
    else
    echo "非异常处理"
    fi

      case..esac语句 

    #!/bin/sh
    FRUIT="balabala"
    case "$FRUIT" in
       "apple") echo "Apple pie is quite tasty." 
       ;;
       "banana") echo "I like banana nut bread." 
       ;;
       "balabala") echo "New Zealand is famous for balabala." 
       ;;
    esac

      格式跟c差不多

    shell循环类型  while,for,until,select循环

      while  循环直到达到条件循环停止    

    #!/bin/sh
    a=0
    while [ $a -lt 10 ]
    do
       echo $a
       a=`expr $a + 1`
    done

      for    for var in word1 word2 ... wordN

    #!/bin/sh  #执行in后面的数并打印
    for var in 0 1 2 3 4 5 6 7 8 9
    do
       echo $var
    done
    #!/bin/sh  #home目录下打印跟.bash后面所有的文件
    for FILE in $HOME/.bash*
    do
       echo $FILE
    done
    #这将产生以下结果:
    /root/.bash_history
    /root/.bash_logout
    /root/.bash_profile
    /root/.bashrc

      util  

    #!/bin/sh  #util英文是直到的意思,解释就是直到a=10的时候循环才结束
    a=0
    until [ ! $a -lt 10 ]
    do
       echo $a
       a=`expr $a + 1`
    done

      select

    语法:

    select var in word1 word2 ... wordN
    do
       Statement(s) to be executed for every word.
    done
    #!/bin/ksh  
    select DRINK in tea cofee water juice appe all none
    do
       case $DRINK in
          tea|cofee|water|all) 
             echo "Go to canteen"
             ;;
          juice|appe)
             echo "Available at home"
          ;;
          none) 
             break 
          ;;
          *) echo "ERROR: Invalid selection" 
          ;;
       esac
    done

    break&continue

      break  结束整个循环

    #!/bin/sh
    a=0
    while [ $a -lt 9 ]
    do
       echo $a
       if [ $a -eq 5 ]
       then
          break
       fi
       a=`expr $a + 1`
    done

      continue  终止本次循环执行下一次循环

    shell替换

    #!/bin/sh
    DATE=`date`
    echo "Date is $DATE"
    USERS=`who | wc -l`
    echo "Logged in user are $USERS"
    UP=`date ; uptime`
    echo "Uptime is $UP"

      结果:

      

    shell 定时清理
      如果要清理tomcat下的logs日志,首先定义脚本存放目录
      创建脚本代码如下

    #!/bin/bash
    find /usr/local/tomcat/logs/ -mtime 10 -name "*.log" -exec rm -rf {} ;
    find /usr/local/tomcat/logs/ -mtime 10 -name "*.txt" -exec rm -rf {} ;

      之后crontab -e 脚本如下
      30 0 * * * 脚本路径 脚本文件

     shell数组

      定义数组值

        array_name[index]=value  数据名[下标]=值

        如果您使用的是ksh shell在这里初始化数组的语法:

        set -A array_name value1 value2 ... valuen

        如果您使用的是bash shell中,这里是初始化数组的语法:

        array_name=(value1 ... valuen)

      访问数组值  

        ${array_name[index]}  访问指定下标
        ${array_name[*]}    访问所有
        ${array_name[@]}    访问所有

    版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    Girls and Boys
    Kindergarten
    codevs 2822 爱在心中
    Popular Cows
    QWQ
    2488 绿豆蛙的归宿(拓扑+dp)
    P1119 灾后重建
    Mr. Frog’s Game
    Basic Data Structure
    A strange lift
  • 原文地址:https://www.cnblogs.com/RainBol/p/9468353.html
Copyright © 2011-2022 走看看