内容一: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
打印结果:
- 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
#这里错误的原因是 指定了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
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- bash 5051 avalanching 0u CHR 16,0 0t1083 663 /dev/ttys000
- bash 5051 avalanching 1u CHR 16,0 0t1083 663 /dev/ttys000
- bash 5051 avalanching 2u CHR 16,0 0t1083 663 /dev/ttys000
- bash 5051 avalanching 3w REG 1,5 0 8602440700 /Users/avalanching/Desktop/fileContent.sh
- 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)