• Linux Shell脚本攻略 读书笔记


    Linux Shell脚本攻略 读书笔记

     

    Linux Shell脚本攻略 读书笔记
    Linux Shell脚本攻略

    这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝;
    最有价值的当属文本处理,对这块我单独整理出来一篇blog,详见《Linux Shell文本处理工具集锦》
    下面是文本处理之外的简单介绍,如果你觉得自己的shell需要充充电,强烈建议读读这本《linux Shell脚本攻略》

    嗨,Echo一下

    从 echo开始:
    带引号的 echo和不带引号的 echo区别:
    使用带引号时,bash 不会对单引号中的变量进行求值,而是原样输出;
    而使用双引号,或者不使用引号,则会对变量进行解析:

    echo '$var' // $var
    echo $var // 5
    echo "$var" // 5
    • 对比printf 的格式化输出
      printf "%-5s %-10s %-4s" NO NAME HELLO //左对齐 宽度为 5 10 4
      具体的值使用右边引号外的;
    • 对比 python中的输出:
      printf " %s " % "hello"

    • 让echo支持转义字符:-e

      [/home/weber#]echo -e '1	2'
      1    2

    给终端来点颜色

    • 在终端彩色输出:

      echo -e 'e[1;31m this is red texte[0m'
      this is red text
    • 更有用的是为我们提示符着色:
      vi .profile添加:
      export PS1='[[e[34;1m]$PWD#e[0m]'
      image

    • 注意环境变量的赋值错误
      var=value //赋值操作 echo $var
      var = value //判断相等操作

      [/home/weber#]var=5
      [/home/weber#]echo 'this is $var'
      this is $var
      [/home/weber#]echo "this is $var"
      this is 5
    • 获取变量值的长度:

        length=${#var} //语法真诡异
    • 打印程序的退出状态:
        echo $?
    • 对.bashrc 修改的简便方法:
        echo 'a=/abc/' >> ~/.bashrc
    • 为rm打造回收站功能:
        alias rm='cp $@ ~/backup; rm $@' 

    shell的控制结构

    • 条件判断

      if condition;
      then
      commands;
      elif condition;
      then
      commands
      else
      commands
      fi
    • 循环结构

      for var in list;
      do
      commands;
      done

      list可以是字符串或是序列;
      echo {1..50} 生成列表
      echo {a..z}

    • 更亲切的for循环(类C)

      for((int i = 0 ; i < 10 ;i++))
      {
      commands;
      }
    • while循环

      while condition
      do
      commands;
      done

    算术比较

    • 语法
      if[ $var -eq 0 ] && action;
      -gt :大于
      -lt: 小于
      -ge: 大于等于
      -le: 小于等于
      -a: 逻辑与
      -o: 逻辑或

    • 字符串的比较,最好使用双中括号
      [[ $str1 == $str2 ]]
      [[ $str != $str ]]
      支持 > 、 <
      判空:-z 非空: -n

    • if更友好:
      if [[ -n $str ]] && [[ -z $str2 ]];
      then
      commands;
      fi

    • 避免if语句过长
      [ condition ] && action ;//condition为真,则执行action
      [ condition ] && action; // condition 为假,则执行aciton
      注意:condition 和[ ] 之间必须有空格,否则报错;

    目录操作

    • 创建长路径目录:

        mkdir -p colin/soft/redis/
    • 粘滞位和setuid:

        chmod a+t file_dir/

      设置了粘滞位,只有目录的所有者才有权限删除该目录

    • 让所有用户都有权限执行文件:

        chown root.root file 
        chmod +s file

      设置setuid文件权限后,它运行其它用户以文件所有者身份来执行文件;
      tips:只有linux 的elf二进制文件才可设置这个文件权限;

    • 文件写保护

        chattr +i file //文件不可修改、不可删除
    • touch的妙用
      touch可用来生成空白文件;如果文件存在,则更新时间戳;
      eg:批量生成100个空白文件

      for name in test{0..100}.txt
      do
      touch $name
      done
    • 只列出目录的方法

      1. ls -d */
      2. ls -F| grep '/$' //-F会在文件尾部列出文件类型;
      3. ls -l| grep '^d' //-l第一行第一个字符是文件类型;
      4. find . -type d -maxdepth 1 -print
    • 切换目录快速定位
      压入并切换:
       pushd /var/www
       dirs: 显示当前路径栈
      选择路径回切(通过索引编号):
       pushd +3
      移除最近压入栈的路径并切换到下一个目录:
       popd

    网站下载

    wget url:直接下载文件或者网页;
    --limit-rate :下载限速,别太快
    -o:指定日志文件;输出都写入日志;
    -c:断点续传

        wget -c ftpUrl

    下载整个站点所有页面

    wget --mirror me115.com

    或者:

    wget -r -N -l DEPTH me115.com

    -l:指定页面层级的深度;
    -N:允许对文件使用时间戳;

    格式化文本形式下载网页

    lynx -dump URL > web.txt

    -dump选项将网页已ASCII字符形式下载到文本文件中;

    更多

    如果需要更丰富的下载功能,考虑使用curl;其支持多种协议,
    还支持POSF、cookie、认证、用户代理字符串等特性;
    如果你想将网页处理流程自动化,cURL是很好的选择;

    tar 归档工具

    • 归档:

        tar -cvf output.tar dir/

      -c:创建规定
      -f:指定文件名
      -v:在归档或解开时显示更多的详细信息

    • -r:追加文件到归档中:

        tar -rvf output.tar dir2/
    • -t:显示归档内容;

        tar -tf output.tar
    • 提取归档文件:

        tar -xvf output.tar
    • 归档时排序版本控制目录(svn、cvs、git等目录信息):

        tar --exclude-vcs -czvf source_code.tar.gz source/

    rsync 备份系统快照

    rsync -av source_path destination_path

    -a:表示归档;-v:归档时显示详细信息
    -z:指定在网络传输时使用数据压缩;
    路径可以是远程路径:
    eg:rsync -avz source_dir usrname@host:path;
    (如果不希望使用交互式的密码输入,可使用SSH密钥来实现)

    注:source_dir末尾如果使用路径/,那么rsync会将source_dir目录中的所有
    内容复制到目的端;如果没有带/,则会将source_dir本身复制到目的端;

    备份时排除部分文件:

    rsync -avz /home/code /mnt/disk/bakup --exclude "*.txt"

    可使用一个列表文件指定需要排除的的文件:
    --exclude-from FILEPATH

    ftp自动传输

    使用ftp选项-i关闭交互会话;
    eg ftp.sh:

    !/bin/bash
    HOST='me115.com'
    USER='colin'
    PASSWD='passwd'
    ftp -i -n $HOST <<EOF
    user ${USER} ${PASSWD}
    binary
    cd /home/linux
    put test.php
    quit
    EOF

    磁盘管理

    • 显示文件大小
        du -h filename
    • 统计文件夹的详细大小及总计

        du -ch svn_archives/

      -s 只输出合计信息;

    • 找出指定目录中最大的文件

        du -ak source_dir | sort -nrk 1| head

      -a:扫描指定目录下所有文件(递归到最深一级目录)
      结果单位指定:-k KB -m MB -h 人性化显示(打算排序的时候,不要用这个,因为单位不统一了)
      上述结果中包含了目录,如果只看文件,不需要目录:

        find . -type f -exec du -k {} ; | sort -nrk 1| head

    故障排查

    • 当前登录用户:who
    • 当前登录主机的用户列表:users
    • 排除重复用户:users | tr ' ' ' ' | sort |uniq
    • 系统运行时长: uptime
    • 获取登录会话信息:last (单个用户 last colin)
    • 列出系统开放端口及运行的服务:
      lsof -i
      或者:
      netstat -tnp

    使用syslog记录日志

    向syslog文件/var/log/messages中记录日志信息:

    logger hello,this is colin

    发送带标记的日志信息

    logger -t ME115  hello,colin coming

    /etc/rsyslog.d/下配置了标记和日志的对应关系;

    杀死进程

    • 通过进程名获取进程id
        ps -C command_name
    • 通过命令名终止进程:
        killall process_name
    • 通过名称强杀进程:

        kill -9 process_name
    • 找出命令所在位置: 

        which php
        whereis php
    • 列出命令简短描述信息:

        whatis ls

    用/proc收集信息

    • 获取cpu信息:
        cat /proc/cpuinfo
    • 获取内存信息:
        cat /proc/meminfo
    • 获取分区信息:
        cat /proc/partitions
      每一个运行的进程在/proc下都有一个以该进程id命名的目录,
      /proc/PID/下的重要文件:
      environ:包含与进程相关的环境变量;
      exe:到进程工作目录的符号链接;
      fd:进程所使用的文件描述符

    Posted by: 大CC | 18NOV,2013
    博客:blog.me115.com
    微博:新浪微博

  • 相关阅读:
    Leetcode: Summary Ranges
    Leetcode: Kth Smallest Element in a BST
    Leetcode: Basic Calculator II
    Leetcode: Basic Calculator
    Leetcode: Count Complete Tree Nodes
    Leetcode: Implement Stack using Queues
    Leetcode: Maximal Square
    Leetcode: Contains Duplicate III
    Leetcode: Invert Binary Tree
    Leetcode: The Skyline Problem
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3432000.html
Copyright © 2020-2023  润新知