linux ctrlc 退出循环_linux按行读取 (while read line与forloop)
在linux下一般用while read line與for循環(huán)按行讀取文件。這兩種方法有什么區(qū)別呢?
現(xiàn)有如下test.txt文件:
1
while read line
while?read?line; do??echo?$line
done?< test.txt
輸出結(jié)果與上圖一致。
這里也可以寫為:
cat test.txt | while?read?line; do??echo?$line
done
輸出結(jié)果一致,但是需要注意一點(diǎn),就是在如下情況下結(jié)果是不同的:
# 第一種情況while?read?line; do?
??name1=$line;
done?< test.txt
echo?$name1
# 第二種情況:
cat test.txt | while?read?line; do
??name2=$line
done
echo?$name2
在第一種情況下輸出:
ENSMUSG00000000078.7 32.83699 29.78868 38.58607 30.348110000000002
第二種情況則無輸出。
出現(xiàn)這種不同,是因?yàn)楣艿赖臋C(jī)制,這個使用管道之后while read line是在子shell中進(jìn)行的,所以退出之后$name2就沒有值了。并且,cat 會一次性地把test.txt的所有內(nèi)容都輸入到內(nèi)存,假如文件很大,則會占用很大的內(nèi)存。但是第二種重定向的方法,是一行一行的讀入,更省內(nèi)存。
2
for循環(huán)
for?i in?`cat test.txt`;do??echo?$i
done
但是輸出了這樣的結(jié)果(部分結(jié)果):
這是因?yàn)?#xff0c;在for循環(huán)中,每次是以空格/制表符為分割符輸出??梢詫懗梢韵滦问捷敵?#xff1a;
# 可以先將空格轉(zhuǎn)為別的字符for?i in?`sed 's/\t/#/g'?test.txt`;do
??echo?$i?| sed 's/#/\t/g'
done
先將空格或者制表符替換為其他字符,輸出的時候再替換回來即可。
總結(jié)
以上是生活随笔為你收集整理的linux ctrlc 退出循环_linux按行读取 (while read line与forloop)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音计算机音乐的id,抖音卡点音乐叫什么
- 下一篇: echarts 3d地球 背面光线太暗_