Shell脚本二:文件描述符、read、IFS分隔符

一、文件描述符介绍

linux shell下常用输入输出操作符是:
标准输入 (stdin) :代码为 0 ,使用 0< 或 0<< ; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin
标准输出 (stdout):代码为 1 ,使用 1> 或1 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr

  1. 文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘
  2. 文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器
  3. 文件描述符2理解为我和计算机交互时,计算机出现错误时的输出,也是指向显示器

二、文件描述符使用

1、标准输出

下面的命令就是把标准输出的位置改到c.txt文件中:

[root@vm01 test]# exec 1>c.txt

在这里插入图片描述
我们看到将标准输出重定向到 c.txt文件后,再ls -l 已经不会输出到控制台了
那么我们必须新开一个终端,查看下c.txt文件内容,
exec:表示永久重定向
在这里插入图片描述

2、标准输入

写一个读取文件内容输出到控制台的shell脚本

#!/bin/bash

exec 0</root/test/c.txt  # 这里会把c.txt文件每一行输入到标准输入0
count=1

while read line  # read 表示读取,line之自定义的一个变量
do
        echo "Line #${count}: $line"
        count=$[ $count + 1 ]  #注意前后空格
done

在这里插入图片描述

3、标准错误输出

标准错误输出和标准输出的区别是,它在命令出错情况下的输出,其他一样

[root@vm01 test]# exec 2> c.txt

4、自行分配文件描述符

除了0, 1,2以外,我们可以分配自己的文件描述符,这样我们也不占用系统默认的标准文件描述符。

[root@vm01 test]# exec 6>c.txt
[root@vm01 test]# echo 'i love linux shell!!!' 1>&6
[root@vm01 test]# cat c.txt
i love linux shell!!!

原理看懂这个,后面举一反三
首先把文件描述符6指向test文件,当我们想找描述符6的时候我们要用&来引用它。
我们可以把文件描述符想像成一个文件的引用,它可以指向任何一个文件(包括显示器),指向的过程就是我们修改默认位置的过程。而用&符号来找到它指向的目标文件,从而向其写入数据。

案例:

exec 3>&1   #表示自定义一个文件描述符3,指向标准输出1
exec 1>c.txt  # 标准输出又指向文件c.txt 
echo "这句话被存到test文件中"
echo "还有这句"
exec 1>&3  # 标准输出1,输出到3;因为前面3引用了标准输出1,所以这里等价于 1>&1,其实就是自己,转了一圈
echo "这句话输出到显示器"

最终结果是:
在这里插入图片描述

5、"&>"文件描述符

“&>”,表示生成的所有输出都会发送到同一个位置

[root@vm01 test]# ls -l &>c.txt

6、关闭文件描述符

[root@vm01 ~]# exec 6>&-

7、/dev/null文件

这是一个很特殊的文件,你写入的任何东西都会清空
1) 我们可以把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息
2) 我们可以快速移除现有文件的数据而不用先删除文件在创建

三、read

read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显)

1、基本读取

read命令接收标准输入(键盘)的输入,或其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
下面是read命令的最简单形式

#!/bin/bash
echo -n "Enter your name:"   #参数-n的作用是不换行,echo默认是换行
read  name                   #从键盘输入
echo "hello $name,welcome to my program"     #显示信息
exit 0                       #退出shell程序。

由于read命令提供了-p参数,允许在read命令行中直接指定一个提示。
所以上面的脚本可以简写成下面的脚本

#!/bin/bash
read -p "Enter your name:" name
echo "hello $name, welcome to my program"
exit 0

在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量

2、计时输入

-t选项指定read命令等待输入的秒数

#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
    echo "hello $name ,welcome to my script"
else
    echo "sorry,too slow"
fi
exit 0

3、默读(输入不显示在监视器上)

有时会需要脚本用户输入,但不希望输入的数据显示在监视器上。典型的例子就是输入密码

#!/bin/bash
read  -s  -p "Enter your password:" pass
echo "your password is $pass"
exit 0

4、读文件的四种方式

1)while循环中执行效率最高,最常用的方法
格式:

function while_read_LINE_bottm(){
 While read LINE
 do
 echo $LINE
 done  < $FILENAME
 }

例:

#!/bin/bash
input="/root/test/d.txt"

while IFS=',' read -r userid group
do
        echo $userid
        echo $group
done <$input

在这里插入图片描述
2)重定向法;管道法

Function While_read_LINE(){
 cat $FILENAME | while read LINE
 do
 echo $LINE
 done
 }

例:

#!/bin/bash
count=1    #赋值语句,不加空格
cat /root/test/c.txt | while read line        #cat 命令的输出作为read命令的输入,read读到的值放在line中
do
   echo "Line $count:$line"
   count=$[ $count + 1 ]         #注意中括号中的空格。
done
echo "finish"
exit 0

3)文件描述符法

Function while_read_line_fd(){
 Exec 3<&0
 Exec 0<$FILENAME
 While read LINE
 Do
 Echo $LINE
 Exec 0<&<3
 }

例:

#!/bin/bash

exec 0</root/test/c.txt  # 这里会把c.txt文件每一行输入到标准输入0
count=1

while read line  # read 表示读取,line之自定义的一个变量
do
        echo "Line #${count}: $line"
        count=$[ $count + 1 ]  #注意前后空格
done
  1. for 循环
function  for_in_file(){
 For  i  in  `cat $FILENAME`
 do
 echo $i
 done
 }

例:

#!/bin/bash

for i in `cat /root/test/d.txt`
do
        echo $i
done

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值