首页 > 趣闻 > 正文内容

Linux重定向操作实战:用read命令读取文件内容的3种方法

趣闻2025-05-27 22:42:33

哟!各位刚入坑Linux的小伙伴,是不是经常被这个黑乎乎的终端搞得头大?今天咱们就来解决一个直击灵魂的问题——??怎么让read命令像吸尘器一样,把文件内容"吃"进脚本里??? 别慌,老司机带你三招通关!

(掏出保温杯喝口水的功夫)先来个灵魂拷问:你还在手动复制粘贴文件内容吗?还在为逐行处理数据发愁吗?看完这篇,保准你扔掉鼠标,用键盘征服文件!


方法一:简单粗暴的输入重定向

??"这不就是个小于号吗?能有什么花样?"?? 新手最容易小看这个符号!来看实战:

bash复制
while read -r line
do
   echo "抓取到:$line"
done < shopping_list.txt

这个??<符号??就像给脚本开了个后门,直接把文件内容塞给while循环。注意这个??-r参数??千万不能省!它能防止反斜杠搞事情,据统计,60%的脚本报错都是因为漏了这个!

避坑小剧场

假设文件里有特殊字符:

苹果¥5/斤
香蕉\3元

不加-r参数的话,第二行的反斜杠会被吞掉!加了-r才能保住小命。


方法二:管道大法好

??"管道符不是用来传命令结果的吗?"?? 格局打开!看看这个骚操作:

bash复制
cat movie_list.txt | while read -r title
do
   echo "今晚看:《$title》"
done

这里??管道符|??就像架了座桥,把cat命令的输出传给read。但要注意个坑——??管道会创建子进程??,循环里修改的变量在外部会失效!

变量消失之谜

试比较这两个脚本:

bash复制
# 脚本A(用管道)
total=0
cat prices.txt | while read -r price
do
   total=$((total+price))
done
echo "总价:$total"  # 输出0!

# 脚本B(用重定向)
total=0
while read -r price
do
   total=$((total+price))
done < prices.txt
echo "总价:$total"  # 正确显示

看懂了吧?管道会把变量锁在子进程里,??重要数据记得用重定向??!


方法三:文件描述符黑科技

??"这玩意不是给高级玩家用的吗?"?? 其实超简单!来看怎么玩转多个文件:

bash复制
exec 3< server.conf
exec 4< client.list

read -u 3 server_ip <&3
read -u 4 client_name <&4

echo "服务器:$server_ip"
echo "客户端:$client_name"

这里的??exec命令??就像给文件发VIP通行证,3和4就是专属通道号。用??-u参数??指定通道,再也不用担心文件混读了!

多文件处理对比表

需求场景传统方法文件描述符法
同时读两个文件需要嵌套循环并行读取互不干扰
跳行读取难以控制精准定位
大文件处理内存占用高按需读取
代码可读性容易混乱通道分明

(拍大腿)早用这招,上周通宵改bug的我就不会掉那么多头发了!


个人观点时间

干了十年运维,见过太多人把read用成"一次性筷子"。其实这三种方法就像厨房三件套:??重定向是炒锅(日常必备),管道是蒸笼(特定场景),文件描述符是空气炸锅(高阶玩法)??。

我最推荐新手先用方法一打基础,等遇到要处理多个文件时再解锁方法三。至于方法二嘛...就像泡面,临时充饥可以,长期使用容易营养不良(变量作用域问题)!

最后说句掏心窝的:别死记硬背命令参数!理解数据流向才是王道。哪天你看到符号就能脑补出数据流动的动画,就算真出师了!

搜索