热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

今天小编就为大家分享一篇浅谈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循环中变量的作用域问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 在 Ubuntu 系统上正确安装 NVIDIA 显卡驱动程序前,首先需要卸载已有的驱动版本。这一步骤至关重要,以避免新旧驱动冲突导致系统不稳定。接下来,可以通过官方仓库或 NVIDIA 官方网站下载最新驱动,并使用终端命令进行安装。确保在安装过程中启用适当的内核模块支持,以获得最佳性能和兼容性。此外,建议在安装后重启系统并验证驱动是否成功加载。 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 在Linux系统中,目录结构遵循文件系统层次标准(FHS),确保了系统的组织性和可维护性。其中,`/bin`目录是FHS要求必须存在的目录之一,主要存放了在单用户维护模式下仍可执行的基本命令和工具。这些命令不仅对root用户可用,普通用户也能使用,以确保系统在最小化运行状态下仍能进行基本的操作和管理。 ... [详细]
  • openGauss行存储核心架构及其页面组织详解
    行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。 ... [详细]
  • 在Linux环境下安装Oracle 11g时,经常会遇到中文显示异常的问题。本文详细介绍了如何解决安装界面中的中文乱码现象,确保用户在安装过程中能够正确显示中文字符。具体步骤包括调整系统语言设置、配置环境变量以及修改Oracle安装文件等方法,以确保安装过程顺利进行。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • Python网络爬虫入门:利用urllib库进行数据抓取
    Python网络爬虫入门:利用urllib库进行数据抓取在数据科学和Web开发领域,Python凭借其简洁高效的特性成为首选语言。本文主要介绍了如何在Windows环境下使用Python的urllib库进行基本的网络数据抓取。考虑到命令行操作的不便,作者选择了Jupyter Notebook作为开发环境,不仅简化了配置过程,还提供了直观的数据处理和可视化功能。通过实例演示,读者可以轻松掌握urllib的基本用法,为深入学习网络爬虫技术打下坚实基础。 ... [详细]
  • 本文深入探讨了romfs与rootfs在概念上的区别及其应用场景。romfs通常作为只读文件系统存储在Flash的特定分区中,其起始地址为0x46000000。相比之下,rootfs是系统的根文件系统,负责管理和加载操作系统的核心组件及应用程序。两者在功能和使用场景上存在显著差异,romfs主要用于存储固件和配置文件,而rootfs则涵盖了更广泛的操作系统资源。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
author-avatar
paalanjorrisch_270
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有