加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

LINUX实操:shell中while循环的陷阱

发布时间:2020-12-13 17:45:43 所属栏目:Linux 来源:网络整理
导读:《LINUX实操:shell中while循环的陷阱》要点: 本文介绍了LINUX实操:shell中while循环的陷阱,希望对您有用。如果有疑问,可以联系我们。 在写while循环的时候,发现了一个问题,在while循环内部对变量赋值、定义变量、数组定义等等环境,在循环表面失效. 一个

《LINUX实操:shell中while循环的陷阱》要点:
本文介绍了LINUX实操:shell中while循环的陷阱,希望对您有用。如果有疑问,可以联系我们。

在写while循环的时候,发现了一个问题,在while循环内部对变量赋值、定义变量、数组定义等等环境,在循环表面失效.

一个简单的测试剧本如下:

#!/bin/bash
echo "abc xyz" | while read line
do
    new_var=$line
done
echo new_var is null: $new_var?

执行成果证明,$new_var的成果是空值.在google上查了查,才发现问题出在管道上.

先看看下面的内容.

while循环的写法有好几种,它的语法布局为:

while test_cmd_list; do cmd_list; done

但更经常地,while循环更多地用于读取尺度输入的内容来实现循环.有以下几种写法:

写法一:使用管道通报内容,这是用的最多、但却最烂的写法

echo "abc xyz" | while read line ?

do?

? ? ...

done

写法二:

while read line

do

? ? ...

done <<< "abc xyz"

写法三:从文件中读取内容

while read line

do

? ? ...

done </path/filename

办法四:采用进程替换

while read var

do

? ? ...

done < <(cmd_list) ? ? ? ? ?

办法五:改变标准输入

exec <filename

while read var

do

? ? ...

done ? ? ? ?

尽管写法有多种,但它们并不等价.办法一中使用的是管道符号,这使得while语句在子shell中执行,这意味着while语句内部设置的变量、数组、函数等在循环外部都不再生效.这正是文章开头所说的陷阱.更简单的:echo haha | a=5,在命令执行结束后,变量a的值也不再是5.其余4种写法,while语句都不在子shell中执行,因此都不会出现文章开头所说的问题.

例如,使用写法二的here string取代写法一:

#!/bin/bash
while read line
do
    new_var=$line
done <<< "abc xyz"
echo new_var is null: $new_var?

或者使用写法四的过程替换:

#!/bin/bash
while read line
do
    new_var=$line
done < <(echo "abc xyz")
echo new_var is null: $new_var?

由此可以说,在上面的5种写法中,使用的最广泛的写法一虽然最简单、便利,但其实是最烂的一种.

本文永远更新链接地址

更多LINUX教程,尽在编程之家PHP学院专栏。欢迎交流《LINUX实操:shell中while循环的陷阱》!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读