Linux Shell学习笔记

年后准备的会议材料,一直没用上。本着共享的精神,拿出来晒晒吧。

Linux Shell ABC
0. 关于shell
0.1 常见的shell
    ---------------------------------------------
        shell               path            name
    ---------------------------------------------
    rc                  /usr/bin/rc         rc
    Bourne shell        /usr/bin/sh         sh
    C shell             /usr/bin/csh        csh
    Bourne Again shell  /bin/bash           bash
    Z shell             /usr/local/bin/zsh  zsh
    Korn shell          /usr/bin/ksh        ksh
    TC shell            /usr/bin/tcshell    tcsh
0.2 shell的启动、更改和退出
    更换shell:
        输入相应的命令可更改
    退出:
        - 输入exit后按
        - 在空行上键入< ^D>
0.3 shell环境变量
    可通过set命令查看,常见的有:
    HOME
    HOSTNAME
    LANG
    LC_CTYPE
    MAIL
    PS1
    PATH
    PWD
    SHELL
    TERM
    UID
    MAIL
0.4 shell元字符
    --------------------------------------------------------------
    元字符          作用                            举例
    --------------------------------------------------------------
    New Line    结束命令行
    Space       分隔命令行中的元素
    Tab         分隔命令行中的元素
    #           注释
    "           引用多字符,允许替换
    $           结束一行;间接引用shell变量         uid:"$UID"
    &           让命令到后台执行                    command &
    '           引用多字符                          '$UID'
    ( )         执行子shell中的命令列表
    *           匹配0个或多个字符                   ls /etc/p*sswd
    [ ]         插入通配符                          ls /etc/rc[0-6].d
    ^           开始一行以及否定符号
    `           命令替换                            NAME=`echo zgq`
    { }         在当前shell中执行命令列表
    |           创建命令之间的管道                  ls | wc -l
    ;           顺序执行命令                        date; sleep 1; date
    >           命令的重定向输出                    echo > /tmp/test.txt
    < 命令的重定向输入                    wc -l < /tmp/test.txt
    ?           通配符为单个字符                    ls /etc/pass??
    /           路径分隔符
    \           转义字符
    !           启动历史列表中指定的事件以及当前事件 !vi
    ~           home目录                            echo ~

0.5 Bash相关配置文件
    /etc/profile
        登录时的系统初始化文件
    ~/.bash_profile
        登录时用户专有的初始化文件
    ~/.bashrc
        登录以及每打开一个交互shell,用户专有的初始化文件
    ~/.bash_logout
        用户退出时执行的文件
    ~/.inputrc
        Individual readline initialization file

1.运行Shell脚本
    - 增加文件可执行权限
        $ chmod +x script_file
    - 直接通过shell命令执行
        $ /bin/sh script_file
        $ /bin/bash script_file
    - 脚本文件开头指定shell
        #!/bin/bash
2. Shell变量及其相关命令
    - 可写环境变量
    - 只读环境变量
        环境变量    含义
        $0          程序名
        $1 - $9     第1-9个命令行参数的值
        $*          所有命令行参数的值
        $@          所有命令行参数的值(如果它被包含在引号中,如"$@",
                    则每个参数也将各自被包含在引号中)
        $#          命令行参数的总数
        $$          当前的进程ID(PID)
        $?          上一条命令的退出状态(0 - 成功,其他输出 - 失败)
        $!          最近后台进程(在后台运行的最后一个进程)的进程ID
     - 相关命令
        - set
        - env(不如set命令完整)
    2.1 读写shell变量
        variable1=value1 [variable2=value2 ... variableN=valueN]
        注意:
            - 等号(=)前后没有空格,如果值中含有空格,须使用引号将这个值括起。
            - 多个赋值语句可写在一行,但必须用空格或分号分隔
        $ name=Guoqiang
        $ echo $name
        Guoqiang
        $ name='Zhou Guoqiang'
        $ echo $name
        Zhou Guoqiang

        $ my_uid='$UID'
        $ echo $my_uid
         $UID
        $ my_uid="$UID"
        $ echo $my_uid
        1000
    2.2 命令替换
        `command`
        $ echo now: `date`
        now: Sun Mar 23 17:44:36 CST 2008

        $ now="date: `date`"
        $ echo $now
        date: Sun Mar 23 17:45:45 CST 2008

        $ now='date: `date`'
        $ echo $now
        date: `date`
    2.3 导出环境变量
        命令export可以向后继shell进程传递变量的值
        export [name-list]
    2.4 重置变量
        unset [name-list]
    2.5 创建只读用户自定义变量
        readonly [name-list]
        类似PHP中的常量
        $ name=zgq gender=male
        $ readonly name gender
        $ echo $name $gender
        zgq male
        $ name=zhang3 gender=female
        bash: name: readonly variable
    2.6 读取标准输入
        read variable-list
3. 脚本参数传递
    - 9个参数($1 - $9)有时不够用
      可以使用shift命令将参数左移N个位置
        shift [N]
    - set [options] [argument-list]
      依次将各位置参数的值设为argument-list中指定的参数
      如果不带任何参数,set将显示所有shell变量以及他们当前的值
4. 注释与程序头
    #!/bin/bash
    #
    #
    #
5. 程序控制
    1. if-then-elif-else-fi语句
        if expiression
        then
            elif expression
            then
                ...
            else
                ...
        fi
      - expression可以使用test命令也可以使用括号
        if test $# -eq 0
        等价为:
        if [ $# -eq 0 ]
        (注意[和]前后的空格)
    2. for语句
        for variable [in argument-list]
        do
            command-list
        done

        如果没有提供argument-list,参数由命令行提供
    3. while语句
        while expression
        do
            command-list
        done

        如果死循环,就<^C>吧
    4. until语句
        until expiression
        do
            command-list
        done
    5. break和continue命令
    6. case语句
        case test-string in
            pattern1)
                command-list1
            ;;
            pattern2)
                command-list2
            ;;
            patternN)
                command-listN
            ;;
            *)
                end-command-list
            ;;
        esac

6. 常用命令集锦
    - 杀死firefox进程
      $ ps aux | grep firefox | grep -v grep |cut -c 9-15 |xargs kill -9
    - 将当前目录下php文件中的foo题换成bar
      $ sed *php -in-place -e's/foo/bar/g'
    - 根据ip查看bbs.insenz.com的访问次数
      $ cat  bbs.insenz.com-access_log  | awk '{print $1}' | sort | uniq -c | sort -nr
    - 查看远程服务器的磁盘空间状况
      $ ssh zhouguoqiang@10.0.1.33 'df -h'
    - 查看svn副本中某两个目录下的代码总行数
      $  find src/ tests/ -type f | grep -v .svn | xargs wc -l | awk '{ sum += $1; } END { print sum; }'

6. 参考资料
    - Unix教程(第二版)
        http://www.douban.com/subject/1809210/
    - man bash, man test

发表评论