浅谈shell循环中变量的作用域问题

 更新时间:2018年06月20日 15:19:14   作者:ChaosV_Ls  
今天小编就为大家分享一篇浅谈shell循环中变量的作用域问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近实现了一个shell脚本,功能简单来说就是从文件中按行读取然后将所有行拼接成一行写入一个文件,关键代码如下

path_all=""
cat $1 | while read line
do
 if [ "$path_all" == "" ];then
 path_all=$line
 else
 path_all=$path_all,$line
 fi
done
echo $path_all > $one_file

结果执行结果竟然是空!按照常理shell中的变量默认是全局变量,不会存在变量作用域的问题,于是上网查了下,发现问题出在while上

while循环读取文件中内容有两种写法,一种是管道符,一种是重定向,写法如下

管道符:

cat $file_name | while read line
do
 #deal with line
done

重定向

while read line
do
 #deal with line
done < $file_name

这两种做法的区别在于,重定向是内建命令,而管道符是非内建命令,

之所以我写的脚本出现了输出是空的问题,原因就在这里

linux执行shell时,会创建“子shell”运行shell中的命令,当运行到非内建指令时,会创建“孙shell”运行非内建指令

变量的作用于在每个shell中有效,所以,非内建指令中定义的这些变量就只能在孙shell运行,而在子shell中不生效,所以,即便我在while中给path_all赋值了,子shell中也不会获取到这个值。

解决这个问题的办法有两种,如下

如果不是必须使用管道符的方式写while循环,可以用重定向的写法,这种写法循环内的变量在子shell中是生效的,比较简便

如果非要使用管道符的方式,可以创建临时文件,用于存放孙shell中的输出

cat $file_name | while read line
do
 echo $line >> $tmp_file
done
cat $tmp_file >$one_file

虽然两种方法都可以解决这个问题,但还是推荐第一种解决方法

以上这篇浅谈shell循环中变量的作用域问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 批量修改ssh配置的expect脚本

    批量修改ssh配置的expect脚本

    公司服务器一般通过ssh进行远程管理。以前大家登录的时候,都是随意选内外网IP进入。王总接手后,说这事隐患太大了,必须禁了外网ssh
    2013-03-03
  • 详解Linux命令中的符号

    详解Linux命令中的符号

    这篇文章主要介绍了Linux命令中的符号,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • linux下监视进程 崩溃挂掉后自动重启的shell脚本

    linux下监视进程 崩溃挂掉后自动重启的shell脚本

    如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题。在Linux系统中,强大的shell就可以很灵活的处理这样的事务
    2013-06-06
  • Shell脚本编写Nagios插件监控程序资源占用

    Shell脚本编写Nagios插件监控程序资源占用

    这篇文章主要介绍了Shell脚本编写Nagios插件监控程序资源占用,本文先是给出了需求和需求分析,然后给出实现代码,需要的朋友可以参考下
    2014-12-12
  • Linux查看端口、进程情况及kill进程的方法

    Linux查看端口、进程情况及kill进程的方法

    下面小编就为大家带来一篇Linux查看端口、进程情况及kill进程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • ssh,scp自动登陆的实现方法

    ssh,scp自动登陆的实现方法

    这篇文章主要介绍ssh,scp自动登陆的实现方法,需要的朋友可以参考下
    2013-02-02
  • linux文本处理工具及正则表达式集锦

    linux文本处理工具及正则表达式集锦

    这篇文章主要介绍了linux文本处理工具及正则表达式集锦,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • 在shell或者perl中改变字体或背景的颜色

    在shell或者perl中改变字体或背景的颜色

    有时候在运行别人写的脚本的时候,在黑乎乎的终端下显示了不同的颜色,好生的羡慕啊,今天就来分享一下,分别在shell和perl中怎么改变我们输出的字体的颜色
    2014-04-04
  • Linux使用文本编辑器vi常用命令

    Linux使用文本编辑器vi常用命令

    vi就是一种功能强大的文本编辑器,而vim则是高级版的vi,不但可以用不同颜色显示文字内容,还能进行诸如shell脚本、C语言程序编辑等功能,可以作为程序编辑器。下面通过本文给大家介绍linux 文本编辑器vi常用命令,一起看看吧
    2017-09-09
  • Linux Shell 自动交互功能实现

    Linux Shell 自动交互功能实现

    本文主要介绍了Linux Shell 自动交互功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论