• shell使用攻略


    shell 是什么

    ~ $ ls /bin/*sh
    /bin/bash  /bin/csh  /bin/ksh  /bin/sh  /bin/tcsh  /bin/zsh
    

    是什么

    • kernel shell
    • 命令解释器,和 kernel 交互
    • 命令语言、程序设计语言

    特性

    • 命令集
    • 胶水语言
    • 操作系统外壳接口

    适合场景

    • 自动化简单任务
    • 快速、简单完成原型

    劣势

    • 移植性 grep --version wget--version
    • 执行效率
    • 组织性,结构性
    • 不支持面向对象特性

    shell 特性

    wget uc.cn -O uc.html 2>/dev/null || echo "Failed to get url"
    
    • 面向字符串
      • 元字符(metacharacter,分割字符串) space tab | < > & ( ) ;
      • 控制字符(control operator,分割命令) || & && ; ;; ( ) | |& <newline>
      • 转义 ' " $ ``
    var=3+5
    echo '$$ `uname` $var $((var))' 
    echo "$$ $ `uname` $var $((var))" 
    
    • 字符串展开
      • 利用元字符分割字符串
      • 如果字符串是用来给变量赋值,则不管它是否被双引号包围,都认为它被双引号包围
      • 大括号展开{};波浪线展开-/、~+/ (不被单引号和双引号包围)
      • 参数和变量展开$USER $var $1 $@ $# ${var[i]} ${var:?value} ${var##value} ${var/pat/str};命令替换 ${cmd} `cmd`;算数展开 $((a+b)) (不被单引号包围)
      • 单词分割;路径展开 (不被单引号和双引号包围)
      • 去掉字符串外面的引号 (如需重复以上流程使用 eval 声明)
    echo {a,b}cd{e,f}  ~  ~-/  `uname`  $(ls /bin/[kcz]sh)  $$  `ls /bin/e*`  /bin/?sh ${var}  $(($var))  $#
    
    • 字符串使用

      • 命令
        • 外部命令,命令名、选项、参数 ls -l /home
        • 内部命令,break continue : . echo eval exec exit export expr printf return set shift trap unset
      • 表达式 ((3+5))、[[ 4 > 5]]
      • 赋值 var=value
    • 常见语法

      • 简单命令 cd ~
      • 管道 uname |grep linux
      • 命令序列 ; & || &&
      • 复合命令 () {} (()) [[]]
    • 流程控制选择

    if condition1; then
        statements
    elif condition2; then
        statements
    else
        statements
    fi
    
    • 流程控制-循环
    for var in one two three four five; do
        echo '$var is '$var
    done
    

    while until case select


    shell 实战

    • 对文件进行按行处理
    cat in.txt |while read url; do
        echo "got $url"
    done > out.txt
    
    • 生成配置包
    tar -zcvf  update.`date '+%Y%m%d_%H%M%S'`.tar.gz somedir
    
    • 生成模板文件(其他格式化文本)
    cat <<EO > index.html
    <html>
    <head>
    <title></title>
    </head>
    hello $USER
    your computer's name `hostname`
    </html>
    EO
    
    • 日志监控及定时处理
    /usr/bin/find /home/dir -type f ! ( -name "*.bz2" -o -name "*.gz" ) -mmin +120 -exec bzip2 {} ; >/dev/null 2>&1
    
    • 去除文件重复(保留文件原有顺序)
    awk '!a[$0]++' in.txt > out.txt
    
    • 从文件中提取指定的内容
    grep -Phio "(?<=\`uri=)[^\`]+" *.log |sort |uniq
    grep -Pio "(?<='customizable': ')[^',]+" *.log  
    `uri=http://13aaaa.com/html/PIC01/332190.html`wait=0.09`slow...
    
    • 文件非交互式编辑
    sed -i 's/dispatch_rule/dispatch_rule = /g' in.txt
    
    • 计算
    awk -F, '{sum+=$2} END{print sum}
    
    • 条件运算 && 、 ||
    ps -ef |grep start_all.py |grep -v grep && exit 2  || python start_all.py
    
    • 变量替换、去除首尾字符
    url='http://www_sina_com_cn/path/index.html'
    echo ${url//_/.}
    echo ${url#http://}
    echo ${url%%/*}
    
    • 循环
    for i in $(seq -w 0 23); do
        echo "log.8???_2014-10-15_$i"                                                                             
    done
    
    • 查找
    find . -type f |xargs -n 1000 grep -Pio -m 1 $key
    find /nfs -size +10000k –xdev –exec ls –lh {} ;
    find ~ -mtime +7 -name "*.log*" -exec rm -rf {} ;
    
    • 文件权限控制 r4 w2 x1 u(ser) g(roup) o(ther) a(ll)
    chmod o+r filename
    chmod 775 filename
    chown user:user_group filename
    

    shell的坑

    • 命令的返回状态 0表示正常
    if uname |grep -i linux; then
        echo 'you are using linux'
    fi
    
    • 通配符扩展(和正则区别)
      * ? [set] [^set] {ba,c,k,z,tc}sh

    • 字符串比较,= != ;数字比较 -eq -ne -lt -le -gt -ge

    if [ "$t1" != "$t2" -a $n1 -eq $n2 ] || [ $n3 -eq 100 ]; then
        ...
    fi
    
    • crontab 任务列表不读环境变量,执行脚本要绝对路径
    30 * * * * source /home/nemo/.bashrc; /home/nemo/somescript  > /dev/null
    0-59   1-23   1-31   1-12   0-6  somescript
    
    • 重定向前后不可为同一文件
    sort in.txt > in.txt
    

    最佳实践

    • 函数内部变量使用 local 声明
    func () {
        local var=hello;
    }
    
    • 变量用花括号
    echo echo ${BASH}_VERSION
    echo ${10}
    
    • 字符串变量用双引号
    [ "$day" = yes ]
    
    • 一步到位
    mkdir -p some/conf/{first,second/{third,forth}}
    vi some/domains.conf
    find . -name "dom*.conf" -exec vi {} ;
    
    • 其他
    tar xvf -C ~ /nfs/some.tar.gz      # 减少移动文档
    cd ~ && tar xvf -C ~ /nfs/some.tar.gz # 鼓励使用列表
    使用  进行长命令折行;
    () {} 对命令分组执行
    rm *.xml; rm some -r #避免 rm * -rf
    

    附:

    shell 内部特殊参数

    字符 通用含义 示例及说明
    * 位置变量列表,使用IFS第一个字符分开 fun 'hello world'
    @ 位置变量列表
    # 位置参数数目
    ? 最近一个前台任务的返回状态 $?
    - 所有发送给shell的标志
    $ 进程ID
    ! 最近被放到后台执行的命令的进程ID
    _ 前一个命令最后一个参数
    0 shell、脚本名、函数名
    1-9 shell、脚本、函数的位置参数 $2 ${10}

    练习

    已知 ls /tmp/* = /tmp/a /tmp/b /tmp/cVAR=/tmp/*,求以下命令的输出:

    1. ls '$VAR'
    2. ls "$VAR"
    3. ls $VAR
    4. ls $VARa
    5. ls ${VAR}a
    6. eval ls "$VAR"

    已知:/etc/hosts的内容为下:

    192.168.1.11  oldboy11.etiantian.org
    192.168.1.21  oldboy21.etiantian.org
    192.168.1.31  oldboy31.etiantian.org
    
    #192.168.1.111  oldboy111.etiantian.org
    

    怎么才能在输入IP后找到/etc/hosts里对应的唯一的hostname?


    列出你最常用到的linux命令

    grep awk sed find vi git  
    cd ls echo cat cp mv wl tar
    

    参考

  • 相关阅读:
    STM32 HAL库 +freeRTOS+Keil 移植
    C# OPENGL DEMO 旋转彩色立方体OpenGL, SharpGL
    常用的user32说明
    C# emgu 多模板匹配
    c#操作Excel模板,替换命名单元格或关键字形成报表
    STM32 USB 鼠标+键盘 串口控制
    USB鼠标键盘数据格式以及按键键值
    C# Emgu 类型转换
    C#来操作Word
    Linux部署H2
  • 原文地址:https://www.cnblogs.com/xiangzi888/p/4025549.html
Copyright © 2020-2023  润新知