Shell语言学习(五)

内容一: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语句

分享个人经历
读书->语文比较差->93分,英语->49分,数学->138
理综:246
历史文化不是很理解
关注文学?->升华思想
历史典故->反应你当下生活,环境,当下团队管理,做人,做事
不同年龄段,读出来的味道不一样
例如:轮扁斫轮
名字“扁”->轮扁
圣人

Shell语言的练习
shell脚本实例---学习的捷径就是练习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容