zoukankan      html  css  js  c++  java
  • Shell【常用知识总结】

    一.常用知识总结

    1.特殊变量($0,@,#,*,?)

    $0:当前脚本的文件名。
    $n:n是一个数字,表示第几个参数。
    $#:传递给脚本或函数的参数个数。
    $*:传递给脚本或函数的所有参数。当被双引号""包含时,会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
    $@:传递给脚本或函数的所有参数。当被双引号""包含时,仍然将每个参数都看作一份数据,彼此之间是独立的。。
    $?:上个命令的退出状态,或函数的返回值。
    $$:当前Shell的进程ID。对于Shell脚本,就是这些脚本所在的进程ID。
    

    2.将date转为指定格式:date +%F

    3.常用的字符(,'',"",``)

    反斜杠():使反斜杠后面的一个变量变为单纯的字符串。
    单引号(’’):转义其中所有的变量为单纯的字符串。
    双引号(""):保留其中的变量属性,不进行转义处理。
    反引号(``):把其中的命令执行后返回结果。
    

    4.流程控制语句(if,for,case,while)

    # if判断
        if [[ condition ]]; then
            do some thing;
        elif [[ condition ]]; then
            do some thing;
        else
            do some thing;
        fi;
    #判断 if 条件的`[ "3" = "3" ]`是否正确,
    #在黑窗口可以使用 `&&`命令看控制台:[ "3" = 3 ] && echo ok
    
    # for循环
        for i in $(seq 10); do
            do some thing;
        done;   
    
    # while循环
        i=10;
        while [[ $i -gt 5 ]];do
            echo $i;
            ((i--));
        done;
    
    # case匹配
        case $1 in
        start | begin)
            echo "start something"  
            ;;
        stop | end)
            echo "stop something"  
            ;;
        *)
            echo "Ignorant"  
            ;;
        esac
    

    5.文件、文件夹是否存在

    #判断文件夹是否存在
    if [ -d "/data/" ]
    #判断文件是否存在
    if [ -f "/data/filename" ]
    

    6.经验之谈

    ①在过滤的时候会用到grep, 但是如果不忽略自身脚本继而执行某些(删除)命令,会把当前脚本杀掉
    ps -ef | grep mysqld | grep -v grep | awk '{print $2}'  | xargs kill -9
    
    ②不想在终端看到命令的输出可以把输出重定向到/dev/null
    命令行 > /dev/null 2>&1 &
    
    ③前台、后台任务
    & 标识将命令放入后台执行,不占用终端显示。
    jobs 能看到所有前、后台命令。
    ctrl + z 可以把任务转移到后台,并且暂停执行。
    fg 将后台的命令调至前台。
    bg 将一个后台的命令变成继续执行。
    
    ④输入、输出的重定向
    标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
    标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
    错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
    
    符号 作用 命令 < 文件 将文件作为命令的标准输入
    命令 << 分界符 从标准输入中读入,直到遇见分界符才停止
    命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2
    
    符号 作用 命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
    命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
    命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
    命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
    命令 >> 文件 2>&1 或 命令 &>> 文件
    

    二.脚本总结

    1.jar启停脚本

    #!/bin/bash
    # 群起nginx和日志服务器   停止
    log_home=/opt/module/gmall-logServer/
    case $1 in
    "start")
        # 启动nginx
        echo "在hadoop102启动nginx"
        sudo /usr/local/webserver/nginx/sbin/nginx
        for host in hadoop102 hadoop103 hadoop104 ; do
            echo "在$host 启动日志服务器"
            ssh $host "source /etc/profile; nohup java -jar $log_home/gmall-log-0.0.1-SNAPSHOT.jar >${log_home}/logs/server.log 2>&1  &"
        done
    
    ;;
    "stop")
        echo "在hadoop102停止nginx"
        sudo /usr/local/webserver/nginx/sbin/nginx -s stop
        for host in hadoop102 hadoop103 hadoop104 ; do
            echo "在$host 停止日志服务器"
            ssh $host "source /etc/profile; jps | awk ' /gmall-log-0.0.1-SNAPSHOT.jar/ {print $1}' | xargs kill -9"
        done
    ;;
    *)
       echo "你启动的姿势不对"
       echo "   log.sh start 启动nginx和日志服务器"
       echo "   log.sh stop  停止nginx和日志服务器"
    esac
    

    2.分发脚本

    xsync

    #!/bin/bash
    #1. 判断参数个数
    if [ $# -lt 1 ]
    then
      echo Not Enough Arguement!
      exit;
    fi
    #2. 遍历集群所有机器
    for host in hadoop102 hadoop103 hadoop104
    do
      echo ====================  $host  ====================
      #3. 遍历所有目录,挨个发送
      for file in $@
      do
        #4 判断文件是否存在
        if [ -e $file ]
        then
          #5. 获取父目录
          pdir=$(cd -P $(dirname $file); pwd)
          #6. 获取当前文件的名称
          fname=$(basename $file)
          ssh $host "mkdir -p $pdir"
          rsync -av $pdir/$fname $host:$pdir
        else
          echo $file does not exists!
        fi
      done
    done
    

    3.常用技能

    1.脚本中kill进程

    java进程可以用jps过滤kill

    jps | awk ' /gmall-log-0.0.1-SNAPSHOT.jar/ {print $1}' | xargs kill -9
    

    其他进程可以用ps过滤kill

    ps -ef | grep bigdata-kafkasource-hdfs | grep -v grep |awk '{print $2}'|xargs -n1 kill -9
    

    注意ps -ef | grep “过滤关键词” 不要和 脚本.sh的名称一样,不然会把脚本也杀掉,脚本的命令也就无法执行了

    2.后台启动jar
    nohup java -jar $log_home/gmall-log-0.0.1-SNAPSHOT.jar >${log_home}/logs/server.log 2>&1  &"
    
    3.启动脚本前最好执行下“source /etc/profile”
  • 相关阅读:
    Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
    (转)Awesome GAN for Medical Imaging
    (转)Awesome Object Detection
    (转)Awesome PyTorch List
    深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning)
    深度学习课程笔记(十六)Recursive Neural Network
    (转)Multi-Object-Tracking-Paper-List
    深度学习课程笔记(十五)Recurrent Neural Network
    (转)Awsome Domain-Adaptation
    论文阅读:Learning Visual Question Answering by Bootstrapping Hard Attention
  • 原文地址:https://www.cnblogs.com/wh984763176/p/13607670.html
Copyright © 2011-2022 走看看