文章目录
一、文件描述符介绍
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
- 文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘
- 文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器
- 文件描述符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
- 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