首页 > 系统相关 >shell中的IFS变量与词分割

shell中的IFS变量与词分割

时间:2024-11-01 13:17:36浏览次数:6  
标签:分割 shell IFS echo 分隔符 字符串

引入

在 bash、zsh、csh 等等各种 shell 实现中,都有一个特殊的内置变量 IFS(Internal Field Separator),意为内部字段分隔符。IFS变量值是一个字符序列,shell会将IFS字符序列中的各个字符视为 词分割(word splitting) 过程中分隔不同token的边界。

正文

1. 什么是词分割以及什么情况下会进行词分割

首先,先看一个 “魔法” 来引出我们的话题:
在这里插入图片描述
好奇怪,明明我们nums变量中数字间隔是凌乱的,为啥 echo 命令输出之后又变得整整齐齐?莫非是 echo 可以自动排版?echo 当然没有智能这种地步,这里的原因是 shell 在 nums 变量展开时 “偷偷地” 进行了词分割,把原本完整的字符串,分成了 ‘1’, ‘2’, ‘3’, ‘4’, ‘5’ 五个子字符串(token)。echo同时打印五个参数,并会默认在不同参数间添加单个空格输出,这样就有了最终整齐的输出效果。

那我们怎么把 nums 原来的模样打印出来,防止被偷偷整容呢?通过显式地添加引号即可禁止词分割
在这里插入图片描述
为了让显示的效果更明显,我在第二条命令中通过转义的方式在两侧添加了两个字面的双引号,如果觉得有些眼花缭乱,那么只看第一条就好了。

在 shell 中,命令的运行结果常以字符串类型返回,此时 shell 自动的将这个结果字符串根据规定好的分隔符切分成多个不同的子字符串(token),这一过程就是词分割。词分割会在参数展开命令替换算术展开以及读取输入的过程中发生。这里所谓 “规定好的分隔符” 即IFS变量中所包含的字符,IFS值默认为一个空格、一个制表符和一个换行符,因此默认情况下以 [ \t\n]+ 作为词分割的分隔符。同时,词分割时会忽略掉字符串开头和结尾的分隔符。

2. 自定义分隔符

除了默认的以空白符作为分隔符之外,我们也可以通过给 IFS 重新赋值修改词分割的分隔符。为更好地展示效果,定义如下函数:

function report_n_args {
	echo "$# args:"
	for arg in "$@"
	do
		echo -n "'$arg' "
	done
	echo
}

2.1 参数展开(zsh默认在参数展开时不做词分割)

在这里插入图片描述
需要注意的是,当空白符作为分隔符时,连续的空白符视作一个分隔符;当非空白字符作为分隔符时,此时连续的非空白分隔符会被作为多个分隔符。
在这里插入图片描述

2.2 命令替换

在这里插入图片描述

2.3 读取输入

如果修改了 IFS 变量值,可以简单地通过 unset IFS 恢复其默认值。
在这里插入图片描述

结语

水平有限,如文中有不恰当的地方,还请指正~

标签:分割,shell,IFS,echo,分隔符,字符串
From: https://blog.csdn.net/OMEMSTMATM/article/details/143377575

相关文章

  • PCL 法线微分(DoN)分割(C++详细过程版)
    目录一、概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,首发于:2024年11月1日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。一、概述  法线微分(DoN)分割在PCL里有现成的调用函数,具体算法原理和实现代码见:PCL基于法线微分(D......
  • Shell 语言教程 (入门)
    Shell介绍Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。shell编程通常指的是学习shell命令语法后,利用这套语法开发脚本程序,操作、访问内核服务。而不是使用C语言......
  • xshell终端识别http ftp 链接 ctrl点击打开链接
    前言全局说明xshell终端识别httpftp链接ctrl点击打开链接一、说明终端链接可以直接点击,比复制一下方便很多二、开启,中断连接识别2.1点工具--选项2.2点键盘鼠标--鼠标按图片勾选免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。......
  • 华为OD机试 E卷|字符串分割转换
    华为OD机试E卷|字符串分割转换0、关于本专栏&刷题交流群本文收录于专栏【2024华为OD机试真题】,专栏共有上千道OD机试真题,包含详细解答思路、与四种代码实现(Python、Java、C++、JavaScript)。点击文末链接加入【华为OD机试交流群】,和群友一起刷题备考。刷的越多,考试中遇到原题的......
  • yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
    #多目标追踪+实例分割+目标检测YOLO(YouOnlyLookOnce)是一个流行的目标检测算法,它能够在图像中准确地定位和识别多个物体。在这里插入图片描述本项目是基于YOLO算法的目标跟踪系统,它将YOLO的目标检测功能与目标跟踪技术相结合,实现了实时的多目标跟踪。在目标......
  • shell学习
    set-e解释如果你是在引用shell脚本中的set-e,那么在shell中它的意思是“如果任何命令的退出状态非零,则立即退出脚本”。这种用法可以防止脚本在遇到错误时继续执行。declare-xARCH="arm"是什么意思?declare-xARCH="arm" 是一个在Bashshell中的命令,具体含义如下:......
  • fstream中ifstream和ofstream的简单用法
    从文件中读数据用ifstream,比如:#include<iostream>#include<fstream>intmain(){std::stringfile_name="path/filename.txt";std::ifstreami_f_stream(file_name);//申请资源创建i_f_stream句柄if(!i_f_stream){......
  • 【红队】利用 PsycheShell 进行 Paste Jacking 以获取隐秘的反向 Shell
    原创Ots安全介绍在网络安全领域,粘贴劫持(PasteJacking)等技术代表着社会工程攻击日益复杂的趋势。当用户从网页上复制看似无害的内容,但粘贴的内容却遭到恶意篡改时,就会发生粘贴劫持。攻击者可以使用此技术在目标机器上执行命令,尤其是当用户粘贴到终端等敏感环境中时。在本......
  • 【java应用】jmeter玩法:BeanShell PreProcessor入口及常用方法介绍
    原创方知本知从零做软件测试现在的系统,信息安全性都在加强。因此,利用Jmeter进行接口压测的时候,通常需要实现模拟登录接口的加密功能。本系列文将介绍如何利用BeanShellPreProcessor实现AES、MD5以及RSA三种加密方法。1.1BeanShellPreProcessor入口在请求中添加前置处理......
  • 物体检测、图像分割技术概述
        物体检测、图像分割是CV领域的两大任务,尤其是物体检测,其在各个领域和AI比赛中,更是占有举足轻重的位置。1、概述图1描述了起源于图像分类的主要计算机视觉类任务。图1发源于图像分类的计算机视觉任务     为什么如此划分?因为在更早的时候,AI圈还停留......