shell编程笔记

1.Bash变量
    用户定义变量 #局部变量
    环境变量 #全局变量
    位置参数变量
    预定义变量
    
    x=val #赋值
    $x #调用
    变量默认为字符型,不能直接运算
    "$x" ${x}  变量叠加,即字符串

    set #查看系统所有变量
        -u 当变量不存在时报错
    unset #清空变量

    pstree #查看进程树

    export x #把x变成环境变量

    PATH="$PATH":/root

    PS1变量
        \d 显示日期 "星期 月 日"
        \H 显示完整主机名
        \t "HH:MM:SS"
        \A "HH:MM"
        \u 当前用户名
        \w 当前所在目录的完整名称
        \W 当前所在目录的最后一个目录
        \$ 提示符

    语系变量
        echo $LANG #当前语系环境
        locale -a | more #所有语系环境
        /etc/sysconfig/i18n #默认语系环境,下次开机启用

    位置参数变量
        $n n为数字,$0表示命令本身,$1-$9表示第一到第九个参数,十个以上的${10}
        $* 代表命令行中所有的参数,一个整体
        $@ 命令行所有参数,分开看
        $# 命令行参数的个数

    预定义变量
        $? 最后一次执行的命令的返回状态,为0则正确
        $$ 当前进程pid
        $! 后台运行的最后一个进程的pid

    read [选项] [变量名]
        -p "提示信息" : 输出提示信息等待输入
        -t 秒数 : 指定等待输入时间
        -n 字符数 : 只接受指定字符数的输入
        -s : 输入不回显

2. 运算符
    declare [+/-][选项] 变量名  #变量类型声明
        +取消变量类型属性
        -设定类型属性
        -a 声明为数组
        -i 整型
        -x 环境变量
        -r 只读  #声明为只读的变量完全不能操作!!!
        -p 显示类型

    声明数组
        movie[0]=zp
        movie[1]=tp
        declare -a moive[2]=live
    查看数组
        echo ${movie}
        echo ${movie[2]}
        echo ${movie[*]}

    export 变量名 <==> declare -x 变量名

    declare -p #列出系统所有变量类型


    数值运算
        expr let
            dd=$(expr $aa + $bb)
        $((表达式))
            ff=$(($aa+$bb))
        $[表达式]
            gg=$[$aa+$bb]

    变量测试
        #在脚本优化时使用
        #具体访问www.imooc.com/video/6832
    
3. 环境变量配置文件(启动时按顺序加载)
    source 配置文件 #. 配置文件
    /etc/profile
    /etc/profile.d/*.sh
    ~/.bash_profile
    ~/.bashrc
    /etc/bashrc #里面定义了PS1,即登录提示符

    umask #查看系统默认权限----w--w-
    文件最高权限为666 #rw-rw-rw-
    目录最高权限为777 #rwxrwxrwx
    权限不能使用数字进行换算,而必须使用字母
    umask定义的权限,是系统默认权限中准备丢弃的权限~

    注销时生效的环境变量配置文件
    ~/.bash_logout #登出配置
    ~/.bash_history #保存历史命令,当前登录历史命令存放在内存
        #/etc/profile HISTSIZE设置历史命令保存条数

    登录文件 #只对本地终端有效
    /etc/issue #登录警告信息
    可以显示的转义符
    \d 当前系统日期
    \s 操作系统名字
    \l 本机终端
    \m 硬件体系架构
    \n 主机名
    \o 域名
    \r 内核版本
    \t 当前系统时间
    \u 当前登录用户的序列号

    远程终端欢迎信息 #不支持转义符
    /etc/issue.net #在/etc/ssh/sshd_config加入"Banner /etc/issue.net"才能显示(重启sshd)

    登录后显示信息 #本地远程均支持
    /etc/motd


4. 条件判断
    文件类型判断,是则真
        -b 块设备
        -c 字符设备
        -d 目录
        -e 存在为真
        -f 普通文件
        -L 链接文件
        -p 管道文件
        -s 非空为真
        -S 套接字文件
    
        test -e /root/install.log
        [ -e /root/install.log ]
        [ -d /root ] && echo yes || echo no

    文件权限判断
        -r 读
        -w 写
        -x 执行
        -u SUID
        -g SGID
        -k SBit
    
    两个文件之间进行比较
        f1 -nt f2 判断f1的修改时间是否比f2新
        f1 -ot f2 判断f1的修改时间是否比f2旧
        f1 -ef f2 判断Inode是否一致(判断硬链接)

    两个整数
        -eq -ne -gt -lt -ge -le

    字符串判断
        -z 字符串 #为空则真
        -n 字符串 #非空则真
        字符串1 == 字符串2 #相等则真
        字符串1 != 字符串2 #不等则真

    条件语句
        if [ 条件判断式 ];then
            程序
        fi
        #或者
        if [ 条件判断式1 ]
            then
            条件成立,程序1
        elif [ 条件判断式2 ]
            then
            条件不成立,程序2
        else
            程序
        fi

    case语句
        case $变量名 in
            "val1")
                part1
                ;;
            "val2")
                part2
                ;;
            *)
                part default
                ;;
        esac

    for循环
        for 变量 in val1 val2 val3 ...
            do
                程序
            done

        for (( i=1;i<100;i=i+1 ))
            do
                程序
            done

    while&until循环
        while [ 条件判断式 ]
            do
                程序
                条件增量 #如 i=$(( $i+1 ))
            done

        until的条件判断式与while相反

5. 正则表达式
    grep awk sed 包含匹配 #正则
    ls find cp 完全匹配 #通配符

    * 任意前个字符
    
    匹配日期
        [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
    匹配ip
        [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}

    cut [选项] 文件名 #字段提取
        -f 字段
        -d 分隔符 #默认制表符
        
    printf '输出类型输出格式' 输出内容
        %ns 输出几个字符
        %ni 几个数字
        %m.nf 几位点几的浮点数

    awk '条件1{动作1} 条件2{动作2}...' 文件名 #复杂
        #df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1
        #awk 'BEGIN{print "..."}{...}'
        FS 指定分隔符
        #cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'
        #cat student.txt | grep -v Name | awk '$4>=70{print $2}'

    sed [选项] '[动作]' 文件名
        #动作
            -a 追加
            -c 行替换
            -i 行前插入
            -p 打印
            -s
            -d 删除行

    字符处理
        sort [选项] 文件名
            -f 忽略大小写
            -n 以数值型排序
            -r 反向排序
            -t 指定分隔符
            -k n[,m] 按指定字段排序,n开始m结束
        
        wc [选项] 文件名
            -l 行
            -w 单词
            -m 字符数

你可能感兴趣的:(linux,shell,管理)