" 2、关闭文件描述符 3、列举打开的文件描述...">
美文网首页Shell学习
第5次课-Shell脚本语言-第5讲

第5次课-Shell脚本语言-第5讲

作者: 泰克2008 | 来源:发表于2017-11-11 22:22 被阅读12次

    内容一:Shell脚本->重定向学习

    1、创建文件读写描述符?"<>"

        作用:这个文件可以读写
        文件内容->fileContent.sh
            装逼
            不装逼
        脚本代码->fileA.sh
            #!/bin/bash
            #创建文件读写描述符
            exec 3<> fileContent.sh
            #读取文件中的一行数据
            read line <&3
            #打印数据
            echo "读取数据:$line"
            #写入文件
            echo "谈恋爱是为了结婚,要不然就是帅流氓" >&3
        执行脚本
            Dream$ cat fileContent.sh
            装逼
            不装逼
            Dream$ ./fileA.sh
            读取数据:装逼
    

    2、关闭文件描述符

        关闭:读写都是不允许的
        语法结构:exec 3>&-
        案例一
            脚本代码
                #!/bin/bash
                #自定义输出描述符
                exec 3> fileContent.sh
                #写入一句话道文件中
                echo "我是傻逼" >&3
                #关闭文件描述符
                exec 3>&-
                #再次写入文件
                echo "但是我喜欢装逼" >&3
            执行脚本
                Dream$ ./fileA.sh
                ./fileA.sh: line 9: 3: Bad file descriptor
            细节:如果说关闭文件描述符,那么你写入内容会报错
        案例二
            脚本代码
                #!/bin/bash
                #自定义输出描述符
                exec 3> fileContent.sh
                #写入一句话道文件中
                echo "我是傻逼" >&3
                #关闭文件描述符
                exec 3>&-
                #打印文件内容
                cat fileContent.sh
                #重新打开
                exec 3> fileContent.sh
                #向文件写入内容
                echo "但是我喜欢装逼" >&3          
    
            执行脚本
                Dream$ ./fileA.sh
    

    3、列举打开的文件描述

        语法结构:lsof命令(隐藏比较深,找不到,为了安全起见)   
            非系统管理员用户也可以采用这个命令插件系统信息
            命令路径:/usr/sbin/lsof 
        执行命令:查看结果
            Dream$ /usr/sbin/lsof -a -p $$ -d 0,1,2
            COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
            bash    5824 Dream    0u   CHR   16,0   0t1800  829 /dev/ttys000
            bash    5824 Dream    1u   CHR   16,0   0t1800  829 /dev/ttys000
            bash    5824 Dream    2u   CHR   16,0   0t1800  829 /dev/ttys000
        分析命令
            /usr/sbin/lsof->表示lsof命令
            "-a"->表示将两个选项结果进行(AND操作)拼接(格式化输出)
            "-p"->进程ID
            "$$"->表示环境变量
            "-d"->表示文件描述符(例如:0、1、2)
        分析结果
            COMMAND->表示正在运行的命令名称(取出名字前9个字符)->由于名字太长我们可以截取
                例如:adbfgtyyththhghg
                取出:adbfgtyyt
            
            PID->进程ID
            USER->进程所属登录名(登录用户)
                例如:管理员、成员
            FD->文件描述符号以及访问类型(r表示读,w表示写,u表示读写)
            TYPE->表示文件类型(CHR:表示字符型,BLK表示块型,DIR表示目录,REG表示文件)
            DEVICE->表示设备号
            SIZE/OFF->如果存在,那么表示文件大小
            NODE->表示本地问你节点号
            NAME->表示文件名称(文件路径)
        案例一:错误代码
            脚本代码
                #!/bin/bash
                exec 3> fileContent.sh
                exec 6> fileB.sh
                exec 7< fileErr.sh
                
                /usr/sbin/lsof -a -p $$ -d 0,1,2
            执行脚本
                Dream$ ./fileA.sh
            总结:没有打印当前执行命令信息,因为你没有指定文件描述符
        案例二:正确代码
            脚本代码
                #!/bin/bash
                exec 3> fileContent.sh
                exec 6> fileB.sh
                exec 7< fileErr.sh
                
                /usr/sbin/lsof -a -p $$ -d 0,1,2,3,6,7
            执行脚本
                Dream$ ./fileA.sh
                COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
                bash    6608 Dream    0u   CHR   16,0    0t324      835 /dev/ttys000
                bash    6608 Dream    1u   CHR   16,0    0t324      835 /dev/ttys000
                bash    6608 Dream    2u   CHR   16,0    0t324      835 /dev/ttys000
                bash    6608 Dream    3w   REG    1,4        0 66971592 /Users/yangshaohong/Desktop/fileContent.sh
                bash    6608 Dream    6w   REG    1,4        0 66754302 /Users/yangshaohong/Desktop/fileB.sh
                bash    6608 Dream    7r   REG    1,4        0 66762178 /Users/yangshaohong/Desktop/fileErr.sh
    

    4、阻止命令输出-> /dev/null

        案例一:阻止输出
            脚本代码
                Dream$ ls -al > /dev/null
        案例二:清空文件
            脚本代码
                #查看内容
                Dream$ cat fileContent.sh
                #清空内容
                Dream$ cat /dev/null > fileContent.sh
                没有任何输出,文件为空
    

    5、创建临时文件

        5.1 创建本地临时文件-> mktemp
            案例一:保证当前目录文件唯一
                #动态生成文件->动态生成后缀名
                Dream$ mktemp dream.XXXXXX
                #指定文件名称->指定文件后缀名
                Dream$ mktemp dream.sh
             案例二:在脚本使用这个命令
                #!/bin/bash
                #创建临时文件
                tempfile=$(mktemp testfile.XXXXXX)
                #重定向临时文件
                exec 3> $tempfile
                #打印文件名称
                echo "文件名称:$tempfile"
                #输出文件内容
                echo "我不是傻逼,我不喜欢傻逼" >&3
                echo "我不装逼,我不喜欢装逼" >&3
                echo "不知道写什么" >&3
                #关闭文件
                exec 3>&-
                #打印文件内容
                cat $tempfile
                #删除文件
                rm -f $tempfile 2> /dev/null
    
        5.2 在/temp目录下创建临时文件
            案例一:"-t"选项使用
                Dream$ mktemp -t testfile.XXXXXX
                /var/folders/7w/4gr2dxc57v3656mjgqmv9mkm0000gn/T/testfile.XXXXXX.ftrZp5qX
                注意一:"/var/folders/7w/4gr2dxc57v3656mjgqmv9mkm0000gn/T"系统提供临时目录
                注意二:不同系统临时目录是不一样
            案例二:在Shell脚本中应用临时目录
                #!/bin/bash
                #创建临时文件(系统临时目录下)
                tempfile=$(mktemp -t testfile.XXXXXX)
                #写入内容
                echo "我不是傻逼,我不喜欢傻逼" > $tempfile
                #追加内容
                echo "我不是傻逼,我不喜欢傻逼,你是不是" >> $tempfile
                #打印文件路径
                echo "文件名称:$tempfile"
                #将文件内容输出到控制台
                cat $tempfile
                #删除文件
                rm -f $tempfile
                
        5.3 创建临时目录
            "-d"创建目录
            脚本代码
                #!/bin/bash
                #当前目录下创建临时目录
                tempfile=$(mktemp -d testfile.XXXXXX)
                #进入临时目录
                cd $tempfile
                #在临时目录下创建临时文件
                tempfile1=$(mktemp testfile.XXXXXX)
                tempfile2=$(mktemp testfile.XXXXXX)
                #自定义文件描述符->重定向输出
                exec 7> $tempfile1
                exec 8> $tempfile2
                #打印临时目录路径
                echo "临时目录路径:$tempfile"
                #向临时文件写入内容
                echo "你好,我不想跪键盘,因为我怕" >&7
                echo "你好,我不喜欢" >&8
            执行脚本
                Dream$ ./fileA.sh
    

    6、记录消息

        作用:将输出同时发送显示器和日志文件,这个时候你可以采用重定向两次,才可以实现,现在我才用tee命令一步实现(简化版)
        案例一:重定向->输出->覆盖
            Dream$ date | tee fileContent.sh
            2017年11月 6日 星期一 22时40分18秒 CST
        案例二:重定向->输出->追加->"-a"
            Dream$ date | tee -a fileContent.sh
        案例三:应用到脚本中
            脚本代码->fileA.sh
                #!/bin/bash
                #定义文件名称
                tempfile="testfile"
                echo "我要输出到控制台和文件" | tee $tempfile
                echo "我要追加内容" | tee -a $tempfile
            执行脚本
                Dream$ ./fileA.sh
    

    内容二:Shell脚本->案例->数据操作->导出SQL文件

    场景:别人给你一个exel表格
    注意:导出.csv格式
    需求:将.csv文件转成.sql文件
    打印:Dream$ cat test.csv
    总结:每一行数据,每一个元素之间都是通过","分割
    脚本实现
        #!/bin/bash
        #定义数据库文件(.sql)文件
        outfile='test.sql'
        #定义域分隔符->分割字符串
        IFS=','
        while read name sex age mv yd phone
        do
            cat >> $outfile << EOF
                INSERT INTO t_test (name, sex, age, mv, yd, phone) VALUES ('$name', '$sex', '$age', '$mv', '$yd', '$phone');
            EOF
        done < ${1}
    执行脚本
        Dream$ ./fileA.sh test.csv
        注意:原始数据空出一行
    
    分析含义
        3个重定向操作
        第一个:输入重定向
            done < ${1}
            ${1}恰好是一个文件
            read通过循环一行行读取内容
            同时read非常智能还会通过IFS进行字符串分割,分割之后会自动给参数赋值
        第二个:输出重定向
            cat >> test.sql
            以上语法:等待输入内容,敲回车,然后输出到指定的重定向文件   
        第三个:输入重定向-"<<"->追加
            (cat >> test.sql ) << sql语句
    

    相关文章

      网友评论

        本文标题:第5次课-Shell脚本语言-第5讲

        本文链接:https://www.haomeiwen.com/subject/zovgmxtx.html