bash特性及find命令

本文深入探讨Bash脚本的基础特性与高级操作,包括变量管理、算术运算、条件测试,以及通过多个实例演示如何利用Bash进行高效的数据处理。同时,详细介绍了Vim编辑器的配置与工作特性定制,覆盖了行号、括号匹配、自动缩进等功能的启用与禁用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bash的基础特性:
bash中的变量的种类:
    根据变量的生效范围等标准:
        本地变量:生效范围为当前shell进程:只对当前shell进程有效,当前shell的子shell进程均无效
        环境变量:生效范围为当前shell进程及其子进程,对其他shell无效(定义:declare -x)
        局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
        位置变量:$1,$2....来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

    本地变量:
        显示已定义的所有变量
            set
        销毁变量:
            unset name
    
    环境变量:
        变量申明、赋值:
            export name=VALUE
            declare -x name=VALUE
        显示所有环境变量
            export
            env
        销毁变量:
            unset name
        
        bash有许多内建的环境变量
        变量命名法则:
            1、不能使用程序中的保留字:例如if、for;
            2、只能使用数字、字母及下划线,且不能以数字开头;

bash的配置文件:
    按生效范围划分,存在两类:
        全局配置:
            /etc/profile
                /etc/profile.d/*.sh
            /etc/bashrc
        个人配置:
            ~/.bash_profile
            ~/.bashrc
    
    按功能划分,存在两类:
        profile类:为交互式登录的shell提供配置
        bashrc类:为非交互式登录的shell提供配置
    
    shell登录:
        交互式登录:
            直接通过终端输入账号密码登录;
            使用"su - UserName"或"su -l UserName"切换的用户
            
        非交互式登录:
            su UserName
            图形界面下打开的终端
            执行脚本
            
    实现算术运算:
        let var=算术表达式
        
        bash有内建的随机数生成器:$RANDOM
        
        自增、自减
            let var+=1
                let var++
            
            let vat-=1
                let var--
    
    练习:写一个脚本
    1、计算/etc/passwd文件中的第10个用户和第20用户的ID之和:
    #!/bin/bash
    userid1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
    userid2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)
    uidnum=$[$userid1 + $userid2]
    echo "uid sum: $uidnum"
    
    2、计算/etc/rc.d/rc.sysinit及/etc/rc.d/init.d/functions文件中所有空白行之和
    #!/bin/bash
    spaceline1=$(grep "^[[:space:]]*$" $1 | wc -l)    #$1为位置变量,在命令行中赋予参数
    spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l)    #$2为位置变量,在命令行中赋予参数
    echo "The sum of space lines: $[$spaceline1+$spaceline2]"
    
    执行时#bash b /etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions
    The sum of space lines: 174
    
    3.统计/etc,/var,/usr目录共有多少个一级子目录和文件:
    #!/bin/bash
    etc=`ls /etc | wc -l`
    var=`ls /var | wc -l`
    usr=`ls /var | wc -l`
    num=$[$etc+$var+$usr]
    echo "All file : $num"

vim编辑器
定制vim的工作特性
    配置文件:永久有效
        全局:/etc/vimrc
        个人:~/.vimrc
    末行模式:当前vim进程有效
    
    (1)    行号
        显示:set nu
        取消显示: set nonu
    (2)    括号匹配
        匹配:set sm
        取消:set nosm
    (3)自动缩进
        启用:set ai
        禁用:set noai
    (4)高亮搜索
        启动:set hlsearch
        禁用:set nohlsearch
    (5)语法高亮
        启用:syntax on
        禁用:syntax off
    (6)忽略字符的大小写
        启用:set ic
        不忽略:set noic    
        
练习:
1、复制/etc/grub.cfg至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符
:%s/^[[:space:]]\+//

2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/function的每行开头为空白字符的行的行首添加一个#号;(增加用“&”)
:%s/^[[:space:]]/#&/        
        
3.复制/etc/rc.d/init.d/functions文件至/tmp目录,替换命令为/tmp/function中的/etc/sysconfig/init为/var/log;
:%s/\/etc\/sysconfig\/init/\/var\/log/

4.删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#
:%s/^#\+[[:space:]]\+//


bash条件测试
    测试方式:
        test EXPRESSION
        [ EXPRESSION ]
        [[ EXPRESSION ]]
    文件测试:
        存在性测试:
            -e FILE:文件存在性测试,存在则为真,否则为假   用echo $?的返回值来判断真假
        存在性及类别测试:
            -b FILE:是否存在且为块设备文件
            -c FILE:是否存在且为字符设备文件
            -d FILE:是否存在且为目录文件
            -f FILE:是否存在且为普通文件
            -h FILE:是否存在且为符号链接文件
            -p FILE:是否存在且为命名管道文件
            -S FILE:是否存在且为套接字文件
        文件权限测试:
            -r FILE:是否存在且可读
            -w FILE:是否存在且可写
            -x FILE:是否存在且可执行
        文件特殊权限测试
            -g FILE:是否存在且拥有sgid权限
            -u FILE:是否存在且拥有suid权限
            -k FILE:是否存在且拥有sticky权限
        文件大小测试:
            -s FILE:是否存在且非空
        
    组合测试条件:
        逻辑运算:
            第一种方式:
                COMMMAND1 && COMMMAND2 且
                COMMMAND1 || COMMMAND2 或
                !COMMAND            取反
                
                [ -e FILE ] && [ -r FILE ]
                
            第二种方式:
                EXPRESSION1 -a EXPRESSION2 且
                EXPRESSION1 -o EXPRESSION2 或
                !EXPRESSION          取反
                
                必须使用测试命令进行:
            
            例:定义变量
            hostName=hostname
            [ -z "$hostName" -o "$hostName"=="localhost.localdomain" ]
                
find            
    find find 路径 表达式
        -name         查找某个指定文件
        -iname         查找时不区分大小写
        -size n     查找n值大小的文件 + 表示大于 默认单位是块(1块=512字节)
        -empty         查找空文件 备注:写入一个10M大小的文件 dd if=/dev/zero of=文件名 bs/M(单位)=count=10
        -user         用户名 查找属于指定用户的文件
        -group         组名 (指定用户组)
        -nouser     没有属主的文件
        -nogroup     没有属组的文件  
        -newer         文件名 查找比文件更新的文件
        -anewer     访问时间
        -cnewer        修改时间
        -amin n     查n分钟前访问过的文件     
        -cmin n     查n分钟前状态改变过的文件
        -mmin n     查n分钟前修改过的文件
        -atime n     n天前
        -used n     查n天使用的文件 -表示在内 +表示之前
        -fstype     文件系统类型 在指定文件系统类型上查找文件
        -perm 权限     查找指定的权限
        
        -exec command {} \;     找到文件后执行命令
        查找后缀为bak的文件并删除
        find / -name ‘*.bak’ -exec rm {} \;    或者     find / -name ‘*.bak’|xargs rm -rf
        
        
        -link n         查找n个硬链接数的文件 大于2 加s links
        -inum i节点ID     查找指定的i节点号
    
    根据文件类型查找:
        -type     TYPE:    查找指定类型的文件 类型文件
        l:符号链接文件
        d:目录文件
        b:块设备文件
        s:socket(套接字)
        p:管道(pipe)
        f:常规文件
    
    组合条件:
        与:-a
        或:-o
        非:-not
    例如: !A -a !B = !( A -o B )    
           !A -o !B = !( A -a B )
    
    找出/tmp目录下,属主不是root,且文件名不是fstab的文件
        find /tmp -not \( -user root -o -name fstab \) -ls
        find /tmp \( -not -user root -a  -not -name fstab \) -ls        
                
                
    根据文件大小来查找
        -size [+|-]#(UNIT数字)
            常用单位:k,M,G
            
        find /var -size #     表示(#-1,#]
    例    find /var -size 3k     #表示大于2k小于等于3k
        
        find /var -size -#     表示[0,#-1]
    例    find /var -size -3k  #表示大于等于0k,小于等于2k
        
        find /var -size +#     表示(#,∞)    
    例    find /var -size +3k  #表示大于3k
                            
    根据时间戳:
        以”天“为单位:
            -atime  [+|-]#          查n天访问过的文件
                    #:[#,#+1)
                    +#:[#+1,∞]
                    -#:[0,#)
                        
            -mtime    [+|-]#            查n天修改过的文件
            -ctime     [+|-]#            查n天状态改变过的文件
        以“分钟”为单位:
            -amin [+|-]#    查n分钟访问过的文件
            -mmin [+|-]#     查n分钟修改过的文件
            -cmin [+|-]#    查n分钟状态改变过的文件
    
    根据权限查找:
        -perm [/|-]MODE
            MODE:精确权限匹配
            /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可
            例:find ./ -perm +222 表示为寻找当前目录下属主或属组或其他有读权限的文件
            -MODE:每一类对象都必须同时拥有为其指定的权限标准
            例如 find ./ -perm -666 表示三类对象必须都拥有读写权限。766、777有多出权限也符合,只要拥有读写即可。
    
    处理动作:
        -print:默认的处理动作,显示至屏幕;
        -ls:类似于对查到到的文件执行“ls -l”命令;
        -delete:删除查找到的文件;
        -fls /path/to/somefile:表示查找到的所有文件的长格式信息保存至指定文件中;
        -ok COMMAND {} \; 对查找到的每个文件执行有COMMAND指定的命令;
            对于每个文件执行命令之前,都会交互式要求用户确认;
        -exec COMMAND {} \;    对查找到的每个文件执行由COMMAND指定的命令;
            {}:用于引用查找到的文件名称自身
        注意:fing传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败,另一方式可规避此问题;
            find | xargs COMMAND
        
练习:
    1.查找/usr目录下不属于root或bin的所有文件或目录;
    find /usr -not -user root -a -user bin
    find /usr -not \( -user root -o -user bin \)
        
    2.寻找当前系统没有属主、属组,且最近一周内曾被访问过的文件或目录;
    find / -nouser -a -nogroup -a -atime -7
        
    3.查找/etc目录下所有用户都没有写权限的文件        
    find /etc -not -perm /222

    4.查找/etc目录下至少有一类用户没有执行权限的文件
    find /etc -not -perm -111
    
    5.查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有写权限的文件
    find /etc/init.d -perm -113

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值