zoukankan      html  css  js  c++  java
  • 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
    

    参考

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/xiangzi888/p/4025549.html
Copyright © 2011-2022 走看看