还是需要用到文件重定向(翻译成白话就是告诉机器使用哪个文件进行输入输出)
网上大多读取两个文件的操作是使用exec实现文件重定向,但是这样exec后,文件重定向操作会永久生效
但是一般只希望在当前命令中有效,之后就没用了。
所以使用read -u命令来指定文件描述符
比如:
read -u3 i
意思是从 3 号 fd (file descriptor,文件描述符) 中读一行数据到 i 变量中
read -u4 j
意思是从 4 号 fd (file descriptor,文件描述符) 中读一行数据到 j 变量中
为啥要从3开始,为啥不用0,1,2
0,1,2 被系统占了
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
所以得从3开始
几号文件的重定向可以在命令最后使用3 < "/data/a.csv"
比如:
[root@vm10-0-0-63 CHbenchmark]# head -n 1 /data/CHbenchmark/settings
# ==================== 连接设置 ====================
[root@vm10-0-0-63 CHbenchmark]# read -u3 i 3<"/data/CHbenchmark/settings";echo $i
# ==================== 连接设置 ====================
第一个命令是输出文件第一行,第二个命令是重定向文件后,读取第一行
可以看到结果是相同的
想重复读取可以在while或者for后面使用3 < "/data/a.csv"
比如:
[root@vm10-0-0-63 CHbenchmark]# for ((i=0;i<5;i++));
> do
> read -u3 line
> echo $line
> done 3<"/data/CHbenchmark/settings"
# ==================== 连接设置 ====================
host=("10.0.0.63" "10.0.0.144" "10.0.0.136")
port=(9000 9000 9000)
user=default
password=""
[root@vm10-0-0-63 CHbenchmark]# head -n 5 /data/CHbenchmark/settings
# ==================== 连接设置 ====================
host=("10.0.0.63" "10.0.0.144" "10.0.0.136")
port=(9000 9000 9000)
user=default
password=""
第一个命令是重定向文件后,读取前5行
第二个命令是输出文件前5行
可以看到结果是相同的
想读取两个文件可以写两个文件重定向
比如:
[root@vm10-0-0-63 CHbenchmark]# head -n 5 a b
==> a <==
1
2
3
4
5
==> b <==
a
b
c
d
e
[root@vm10-0-0-63 CHbenchmark]# for ((i=0;i<5;i++));
> do
> read -u3 linea
> read -u4 lineb
> echo $linea
> echo $lineb
> done 3<"/data/CHbenchmark/a" 4<"/data/CHbenchmark/b"
1
a
2
b
3
c
4
d
5
e
何时读取下一行,读取什么文件之类的都可以使用if来设定
这样就可以根据需求自由设定了。