Shell脚本语言基础六

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

    1、创建文件读写描述符 "<>"
    作用:这个文件可以读写
    文件内容:
         吃午饭
         青藏高原
    脚本代码:
         #!/bin/bash
         #创建文件读写描述符
         exec 3<> fileContent.sh
         #读取文件中的一行数据
         read line <&3
         #打印数据
         echo "读取数据: $line"
         #写入文件
         echo "北京欢迎你" >&3
    执行脚本
         cat fileContent.sh
         吃午饭
         青藏高原
        ./A.sh
2、关闭文件描述符
    关闭:读写都是不允许的
    语法结构: exec 3>&-
    案例一
        脚本代码
             #!/bin/bash
             #自定义输出描述符
             exec 3> fileContent.sh
             #写入一句话到文件中
             echo "天气真好" >&3
             #关闭文件描述符
             exec 3>&-
             #再次写入文件
             echo "大晴天" >&3
         执行脚本
             ./A.sh
             ./A.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
        执行脚本:
            ./A.sh
    3、列举打开的文件描述
        语法结构:lsof命令(隐藏比较深,找不到,为了安全起见)
            非系统管理员用户可以采用这个命令插件系统信息
            命令路径:/usr/sbin/lsof
            执行命令:查看结果/usr/sbin/lsof -a -p $$ -d 0,1,2
             COMMAND PID   USER   FD   TYPE DEVICE  SIZE/OFF NODE NAME
             bash    935 Wisdom    0u   CHR   16,3 0t6197646  657 /dev/ttys003
             bash    935 Wisdom    1u   CHR   16,3 0t6197646  657 /dev/ttys003
             bash    935 Wisdom    2u   CHR   16,3 0t6197646  657 /dev/ttys003

            分析命令
                /usr/sbin/lsof -表示lsof命令
                “-a” 表示将两个选项结果进行(AND操作)拼接(格式化输出)
                "-p"  进程ID
                "$$" 表示环境变量
                     "-d" 表示文件描述符(例如:0,1,2)
                分析结果
                COMMAND-表示正在运行的命令名称
                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
                 /usr/sbin/lsof -a -p $$ -d 0,1,2

        执行脚本./A.sh
        执行结果
             COMMAND  PID   USER   FD   TYPE DEVICE  SIZE/OFF NODE NAME
             bash    1190 Wisdom    0u   CHR   16,3 0t6198679  657 /dev/ttys003
             bash    1190 Wisdom    1u   CHR   16,3 0t6198679  657 /dev/ttys003
             bash    1190 Wisdom    2u   CHR   16,3 0t6198679  657 /dev/ttys003

        总结:没有打印当前执行命令信息,因为没有指定文件描述符
    案例二:正确代码
         执行代码:
         #!/bin/bash
         exec 3> fileContent.sh
         exec 6> fileB.sh
         /usr/sbin/lsof -a -p $$ -d 0,1,2,3,6

        执行脚本: ./A.sh
         执行结果:COMMAND  PID   USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
         bash    1210 Wisdom    0u   CHR   16,3 0t6199105      657 /dev/ttys003
         bash    1210 Wisdom    1u   CHR   16,3 0t6199105      657 /dev/ttys003
         bash    1210 Wisdom    2u   CHR   16,3 0t6199105      657 /dev/ttys003
         bash    1210 Wisdom    3w   REG    1,4         0 35016626 /Users/Wisdom/Desktop/进阶代码/流媒体/第六天/fileContent.sh
         bash    1210 Wisdom    6w   REG    1,4         0 35018608 /Users/Wisdom/Desktop/进阶代码/流媒体/第六天/fileB.sh


    4 、阻止命令输出- /dev/null
        案例一:阻止输出
            脚本代码ls -al>/dev/null
        案例二:清空文件
            脚本代码
             #查看内容
             cat B.sh
             清空内容
             cat /dev/null > B.sh
            没有任何输出,文件为空
    5、创建临时文件
        5.1 创建本地临时文件 - mktemp
        案例一:保证当前目录文件唯一
             #动态生成文件-动态生成后缀
             mktemp  CC.XXXXXX
             #指定文件名称-指定文件名后缀
             mktemp DD.abc

        案例二:在脚本使用这个命令
             #!/bin/bash
             #创建临时文件
             tempfile=$(mktemp testfile.XXXXXX)
             #重定向临时文件
             exec 3>$tempfile
             #打印文件名称
             echo "文件名称:$tempfile"
             #输入文件内容
             echo "太阳" >&3
             echo "月亮" >&3
             #关闭文件
             exec 3>&-
             #打印文件内容
             cat $tempfile

        5.2  在/temp目录下创建临时文件
            案例一:“-t”选项使用
              执行代码:  mktemp -t testfile.XXXXXX
                执行结果: /var/folders/1h/n6rytb0n3j5f0lq45_8y71h40000gn/T/testfile.XXXXXX.LlhZiH0R
                注意一:/var/folders/1h/n6rytb0n3j5f0lq45_8y71h40000gn/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

    6、记录消息
        作用:将输出同时发送显示器和日志文件,这个时候需要重定向两次,才可以实现
            现在采用tee命令一步实现
         案例一:重定向-输出-覆盖
         date | tee fileContent.sh
         2018年 5月16日 星期三 14时54分27秒 CST
        案例二:重定向-输出-追加- "-a"
            date|tee -a fileContent.sh
        案例三:应用到脚本中
                脚本代码
                 #!/bin/bash
                 #定义文件名称
                 tempfile="test"
                 echo "我要输出到控制台和文件"|tee $tempfile
                 echo "我要追加内容" | tee -a $tempfile

猜你喜欢

转载自blog.csdn.net/qq_33323291/article/details/80337253