shell脚本不使用exec,同时读取两个文件

还是需要用到文件重定向(翻译成白话就是告诉机器使用哪个文件进行输入输出)

网上大多读取两个文件的操作是使用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来设定

这样就可以根据需求自由设定了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值