shell脚本的那点小事儿--shell重定向的补充(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27339239/article/details/82626443

内容一:shell脚本的重定向

1.创建文件的读写描述符

复习:

1.1重定向输入输出

exec 重定向类型值(系统默认为0,1,2;可以自定义)<>[读入的路径]

2.关闭重定向描述符

2.1禁止对文件进行读写,相当于对文件上锁,仅用于当前脚本无法读写

语法结构: exec 3>&-

案例一 关闭读写

脚本代码:

#!/bin/bash

exec 3>fileContent.sh
echo "我是傻逼" >&3
exec 3>&-
echo "我反悔了" >&3

注意:

./fileA.sh: line 15: 3: Bad file descriptor

如果关闭了,就无法写入,如果调用写入代码错误如上

案例二 关闭后再开启

#!/bin/bash

exec 3>fileContent.sh
echo "我是傻逼" >&3

#关闭
exec 3>&-
echo "我反悔了" >&3

#重新开启
exec 3>fileContent.sh
echo "写入重新打开了"

3.列举打开的文件描述

语法结构:lsof命令(隐藏比较深,找不到,为了安全起见) 

非系统管理员用户也可以采用这个命令插件系统信息

命令路径:/usr/sbin/lsof 

执行命令:查看结果

终端输入: /usr/sbin/lsof -a -p $$ -d 0,1,2

打印结果:

  1.         COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  2.         bash    5824 Dream    0u   CHR   16,0   0t1800  829 /dev/ttys000
  3.         bash    5824 Dream    1u   CHR   16,0   0t1800  829 /dev/ttys000
  4.         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
#这里错误的原因是 指定了3,6,7的输入和输出,但是/usr/sbin/lsof -a -p $$ -d 0,1,2却只是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

执行脚本

./fileA.sh

  1. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  2. bash 5051 avalanching 0u CHR 16,0 0t1083 663 /dev/ttys000
  3. bash 5051 avalanching 1u CHR 16,0 0t1083 663 /dev/ttys000
  4. bash 5051 avalanching 2u CHR 16,0 0t1083 663 /dev/ttys000
  5. bash 5051 avalanching 3w REG 1,5 0 8602440700 /Users/avalanching/Desktop/fileContent.sh
  6. bash 5051 avalanching 6w REG 1,5 0 8602445415 /Users/avalanching/Desktop/fileB.sh

4.阻止命令的输出

案例一:阻止命令的输出

脚本代码: 打印到系统的临时文件,不让信息在控制台输出

ls -al > dev/null

案例二:清空文件

脚本代码:将系统临时文件null中的内容写入到需要清空的文件中去

cat dev/null > xxxx.xx

5.创建临文件

5.1创建临时文件

案例一:保证当前目录下文件是唯一的

在终端直接输入

1)动态创建文件.XXXXXX随机生成(一定是大写,并且是6个X)

mktemp ava.XXXXXX

2)指定具体的文件名生成临时文件

mktemp ava.sh

案例二:在脚本中创建临时文件

#!/bin/bash

#创建临时文件
#一定是6个大写的X
tempfile=$(mktemp temp.XXXXXX)

#打印临时文件
echo "临时文件的路径:${tempfile}"

#创建重定向修饰符
exec 3> ${tempfile}

#向临时文件写入内容
echo "我是一个临时文件" >&3
echo "我现在接收了一些信息,等一下程序跑完了,我就要被删除了" >&3
echo "拜拜!" >&3

#关闭文件
exec 3>&-

#打印临时文件
cat -n ${tempfile}

#删除临时文件
rm -f $tempfile 2> /dev/null

内容二:脚本导出数据文件

将excel表格导出成.csv格式,利用代码生成.sql文件

#!/bin/bash

outfile='test.sql'
#自定义分隔符
IFS=','
while read name gender age dev number

do
    cat >> $outfile << EOF
    INSERT INTO user_info_table (name, gender, age, dev, number) VALUES ('$name',         '$gender', '$age','$dev', '$number');
    EOF
done<${1}

#定义了IFS,read接受的输入将会按IFS进行切割

调用脚本:

./dataSource.sh test.csv

分析含义:

三个重定向

第一个重定向

done<${1}

${1}输入一个文件

read循环读取文件的内容,同时通过IFS分割内容,分别赋值给name, gender, age, dev, number

第二个重定向

cat >> $outfile

cat >> 让文件进入等待输入,将输入的内容重定向到$outfile中。

第三个重定向

(cat >> $outfile) << sql 语句

将sql语句输入到等待输入的文件中

EOF...EOF:标志符,标志内容开始和结束,可以定义为其他的非关键字的标识符(AAA...AAA, BBB...BBB)

注意:以上的缩进是为了方便查看层级关系,如果在运行代码中报错(not found command),请去除缩进,注意if后的空格

猜你喜欢

转载自blog.csdn.net/qq_27339239/article/details/82626443