当前位置: 首页 > news >正文

Shell中的IFS

IFS是shell的内置变量,IFS是一个字符串,里面的每一个字符都会用来作为分隔符进行单词分割。

IFS变量只在当前shell起作用。

一、对$*的影响

先做参数替换把$*替换成参数列表。相当于args[]

然后下面分两种情况:

(1)当$*不在双引号里面时,要做单词分割,把args的每个元素继续按IFS分割成多个单词,比如$1可能分成两个单词,$2可能分成三个单词

(2)当$*在双引号里面时,跳过单词分割,直接把args每个元素以IFS每一个字符连接成单个单词,即"$1c$2c$3"。c是IFS每一个字符

举例:

#!/bin/bash

old_ifs=$IFS

IFS=:

set "a:b-c" "d:e f"

echo 参数个数:$#

echo $*

loopcount=0

for i in $*; do

     echo $i

    ((loopcount++))

done

echo 循环次数:$loopcount

echo "$*"

loopcount=0

for i in "$*"; do

     echo $i

     echo "$i"

    ((loopcount++))

done

echo 循环次数:$loopcount

IFS=$old_ifs

运行结果

参数个数:2
a b-c d e f
a
b-c
d
e f
循环次数:4
a:b-c:d:e f
a b-c d e f
a:b-c:d:e f
循环次数:1

二、对$@的影响

先做参数替换把$@替换成参数列表。相当于args[]

然后下面分两种情况:

(1)当$@不在双引号里面时,要做单词分割,把args的每个元素继续按IFS分割成多个单词,比如$1可能分成两个单词,$2可能分成3个单词

(2)当$@在双引号里面时,跳过单词分割,把每个元素单独作为单词,最后是多个单词,即"$1" "$2" ...

举例:

#!/bin/bash

old_ifs=$IFS

IFS=:

set "a:b-c" "d:e f"

echo 参数个数:$#

echo $@

loopcount=0

for i in $@; do

     echo $i

    ((loopcount++))

done

echo 循环次数:$loopcount

echo "$@"

loopcount=0

for i in "$@"; do

       echo $i

       echo "$i"

    ((loopcount++))

done

echo 循环次数:$loopcount

IFS=$old_ifs

运行结果:

参数个数:2
a b-c d e f
a
b-c
d
e f
循环次数:4
a:b-c d:e f
a b-c
a:b-c
d e f
d:e f
循环次数:2

三、对变量替换结果的影响

先做变量替换,然后再分下面两种情况:

(1)当不在双引号里面时,要做单词分割,把替换后字符串按IFS分割成多个单词。

(2)当在双引号里面时,跳过单词分割,保持原样,是单个单词。

举例:

#!/bin/bash

old_ifs=$IFS

IFS=':;'

var="; a:b;:c:"

echo 不带引号变量:$var

echo -n 不带引号变量逐字符:

echo -n $var |od -a

echo 带引号变量:"$var"

echo -n 带引号变量逐字符:

echo -n "$var" |od -a

echo ----------

loopcount=0

for i in $var; do

       echo $i

    ((loopcount++))

done

echo 循环次数:$loopcount

echo ----------

loopcount=0

for i in $var; do

       echo -n $i |od -a  

    ((loopcount++))

done

echo 循环次数:$loopcount

echo ----------

loopcount=0

for i in "$var"; do

       echo $i

       echo "$i"

    ((loopcount++))

done

echo 循环次数:$loopcount

echo ----------

loopcount=0

for i in "" " a" "b" "" "c"; do  

       echo -n $i |od -a  

    ((loopcount++))

done   

echo 循环次数:$loopcount

IFS=$old_ifs

运行结果

不带引号变量: a b c
不带引号变量逐字符:0000000 sp sp a sp b sp sp c
0000010
带引号变量:; a:b;:c:
带引号变量逐字符:0000000 ; sp a : b ; : c :
0000011
----------

 a
b

c
循环次数:5
----------
0000000
0000000 sp a
0000002
0000000 b
0000001
0000000
0000000 c
0000001
循环次数:5
----------
a b c
; a:b;:c:
循环次数:1
----------
0000000
0000000 sp a
0000002
0000000 b
0000001
0000000
0000000 c
0000001
循环次数:5
 

可以看到for i in $var与for i in "" " a" "b" "" "c"是一模一样的。

总结一下:

双引号中

不在双引号中

$*

替换后不做分割,把各个参数用IFS连起来。

最终是一个单词

"$1c$2c$3..."

c 是IFS首个字符

替换后做分割,对每个参数继续以IFS进行分割

最终是多个单词

word1 word2 word3 word4 word5...

word1 word2可能来自参数$1

word3 word4来自参数$2

word5来自参数$3

$@

替换后不做分割,各个参数单独做单词。

最终是多个单词

"$1" "$2" "$3"...

替换后做分割,对每个参数继续以IFS进行分割

最终是多个单词

word1 word2 word3 word4 word5...

word1 word2可能来自参数$1

word3 word4来自参数$2

word5来自参数$3

变量

var="1-2-3"

IFS='-'

替换后不做分割,保持原样。

最终是一个单词

"1-2-3"

替换后做分割,以IFS进行分割

最终是多个单词

"1" "2" "3"

四、一些应用:

(一)批量重命名文件名含有空格的文件

重命名前:

txt 2014.02.14.log

txt 2014.02.15.log

重命名后:

txt_2014_02_14.log

txt_2014_02_15.log

脚本内容

oldifs=$IFS

IFS=$'\n'

for file in `ls`;do

     mv $file `sed -r 's/[ .]/_/g;s/(.*)_/\1./' <<< $file`

done

IFS=$oldifs

相关文章:

Shell中的IFS

IFS是shell的内置变量&#xff0c;IFS是一个字符串&#xff0c;里面的每一个字符都会用来作为分隔符进行单词分割。 IFS变量只在当前shell起作用。 一、对$*的影响 先做参数替换把$*替换成参数列表。相当于args[] 然后下面分两种情况&#xff1a; &#xff08;1&#xff09…...

Java学习线路图--书籍推荐

----基础---- 《Java从入门到精通》 ----进阶---- 一 《Java项目开发全程实录》《Java开发实例大全&#xff08;基础篇&#xff09;》《Java开发实例大全&#xff08;提高篇&#xff09;》 二 《Java Web从入门到精通》《Java Web项目开发全程实录》《Java Web开发实例大…...

【GO】k8s 管理系统项目23[前端部分–工作负载-Pod]

k8s 管理系统项目[前端部分–工作负载-Deployment] 1. 代码部分 1.1 准备工作 由于Pod页面和Deployment内容差不多.那么就直接把Deployment的内容复制过来.再做修改. 替换Deployment为Pod替换Deploy为Pod替换deployment为pod替换deploy为pod禁用新增的按钮,删除新增方法,表…...

rabbitmq在linux系统下安装步骤

第一步&#xff1a;登录官网 官网地址&#xff1a;www.rabbitmq.com,点击Get Started 重要信息&#xff1a;RabbitMQ Tutorials手册&#xff0c;描述了工作模式 第二步&#xff1a;点击Download Installation下载 重要信息&#xff1a;rabbitmq是用erlang语言开发的&#xff0…...

阿里测试员晒薪资条,看完真的扎心了...

前几天&#xff0c;有位老粉私信我&#xff0c;说看到某95后学弟晒出阿里的工资单&#xff0c;他是真酸了…想狠补下技术&#xff0c;努力冲一把大厂。 为了帮到他&#xff0c;也为了大家能在最短的时间内做面试复习&#xff0c;我把软件测试面试系列都汇总在这一篇文章了。 …...

内网渗透辅助工具集Yasso

目录 介绍 工具优势 程序功能模块 目前已有用功能模块 使用例子 工具下载</...

Spring笔记(1):概述

1、什么是Spring&#xff1f; Spring是最受欢迎的企业级Java应用程序开发框架&#xff0c;使用它创建性能好、易于测试、可重用的代码。Spring是一种轻量级的框架。Spring框架的核心特性是开发任何Java应用程序&#xff0c;其目标是使得J2EE开发变得更容易&#xff0c;通过启用…...

工程机械焊接件焊接结构件三维扫描检测外观质量控制-CASAIM三维扫描检测仪

焊接已发展为制造业中的一种重要的加工方法&#xff0c;广泛应用于航空、航天、冶金、石油、汽车制造以及国防等领域。工程机械焊接件品种繁多、几何形状复杂&#xff0c;焊接件质量的好坏将直接影响到产品的使用寿命长短。对焊缝表面尺寸测量及评定表面焊缝缺陷时&#xff0c;…...

使用linux部署项目步骤

文章目录前言一、服务器环境配置二、数据库导入三、项目打包1、修改项目中的访问路径2、修改db.properties的数据库访问路径3、打包4、修改配置&#xff0c;启动服务四、测试总结前言 今天学习了在服务器中部署项目&#xff0c;记录一下 一、服务器环境配置 首先要安装VMware&…...

pt02-list-tuple-dir

容器类型 通用操作 数学运算符 (1) 用于拼接两个容器 (2) 用原容器与右侧容器拼接,并重新绑定变量 (3) * 重复生成容器元素 (4) * 用原容器生成重复元素, 并重新绑定变量 (5) !&#xff1a;依次比较两个容器中元素,一但不同则返回比较结果。< < > > 意…...

高端电器新十年,求解「竞速突围」

竞争激烈的高端电器品牌们&#xff0c;平时王不见王&#xff0c;但也有例外。海尔、博西、海信、创维、方太、老板等等近乎中国电器行业所有一线品牌副总裁级别以上高层&#xff0c;2月22日都现身于上海&#xff0c;来参加一场由红星美凯龙攒起来的高端电器局&#xff0c;2023中…...

[Android Studio] Android Studio使用keytool工具读取Debug 调试版数字证书以及release 发布版数字证书

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…...

2023年金三银四必备软件测试常见面试题1500问!!!【测试思维篇】

五、测试思维5.1 打电话功能怎么去测&#xff1f;我们会从几个方面去测试&#xff1a;界面、功能、兼容性、易用性、安全、性能、异常。1&#xff09;界面我们会测试下是否跟界面原型图一致&#xff0c;考虑浏览器不同显示比例&#xff0c;屏幕分辨率。2&#xff09;功能&#…...

推荐四款自用的电脑神器

作为一个经常鼓捣电脑的小编来说&#xff0c;无论是写文章、截图、办公方面都缺少不了一些好用的软件&#xff0c;今天就给大家盘点一些我推荐用的办公效率工具&#xff0c;让你的效率事半功倍。 写文章神器 以前写文章一直是在公众号编辑上直接写的&#xff0c;缺点就是格式有…...

CSDN 竞赛 32 期

CSDN 竞赛 32 期1、题目名称&#xff1a;传奇霸业2、题目名称&#xff1a;严查枪火3、题目名称&#xff1a;蚂蚁家族4、题目名称&#xff1a;运输石油小结1、题目名称&#xff1a;传奇霸业 传奇霸业&#xff0c;是兄弟就来干。 小春(HP a)遇到了一只黄金哥布林(HP x)。 小春每…...

【路径规划】基于前向动态规划算法在地形上找到最佳路径(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

spring boot maven打包jar包太大,怎么办?这个方法解决你的烦恼

在springboot maven项目中&#xff0c;有两种打包方式&#xff0c;一种是war包&#xff0c;一种是jar&#xff0c;今天我们讲一下jar的打包方式。但是在jar包打包只要我们发现&#xff0c;我们的项目jar太大了&#xff0c;每次上传到服务器的时候非常的慢&#xff0c;接下来我们…...

Spring之AOP理解及使用

文章目录AOP是什么AOPSpring的通知类型1.Before通知2. AfterReturning通知3.AfterThrowing通知4. After通知5. Around通知动态代理JDK动态代理CGLib动态代理动态代理的代码展示AOP使用切面类的配置最后大家好&#xff0c;我是Leo&#xff01;今天给大家带来的是关于Spring AOP的…...

微信小程序和webview使用postMessage交互

小程序和webview能交互&#xff0c;但是没有你想的那个完美小程序向webview传递参数只能使用url携带参数webview向小程序传递参数可以使用postMessage, 但是注意了&#xff0c;postMessage只会在特定的时机执行&#xff0c;请看官方文档由此可见&#xff0c;如果你想点击webvie…...

pytorch-自动求导机制,构建计算图进行反向传播,需要注意inplace操作导致的报错,梯度属性变化

PyTorch 作为一个深度学习平台&#xff0c;在深度学习任务中比 NumPy 这个科学计算库强在哪里呢&#xff1f;一是 PyTorch 提供了自动求导机制&#xff0c;二是对 GPU 的支持。由此可见&#xff0c;自动求导 (autograd) 是 PyTorch&#xff0c;乃至其他大部分深度学习框架中的重…...

Terraform CDK资产管理终极指南:如何高效管理文件、目录和模块资产

Terraform CDK资产管理终极指南&#xff1a;如何高效管理文件、目录和模块资产 【免费下载链接】terraform-cdk Define infrastructure resources using programming constructs and provision them using HashiCorp Terraform 项目地址: https://gitcode.com/gh_mirrors/te/…...

毕业设计实战:基于SSM+Vue的家乡特产网上商城设计与实现指南

毕业设计实战&#xff1a;基于SSMVue的家乡特产网上商城设计与实现指南 在开发“基于SSMVue的家乡特产网上商城”毕业设计时&#xff0c;我曾因商品订单表未通过用户ID、商品ID与收货地址ID三外键关联踩过关键坑——初期设计订单表时&#xff0c;仅记录了订单号、购买数量、实…...

初始Flask框架

摘要Flask 作为 Python 生态中最受欢迎的轻量级 Web 框架&#xff0c;以其 “微内核、易扩展” 的设计理念&#xff0c;成为 Web 开发初学者的首选工具。本文基于 Flask 核心基础&#xff0c;从框架概述、环境搭建、路由视图、模板渲染、表单处理、项目结构到生产部署&#xff…...

springcloud-alibaba基于springcloud的电子商城系统_80k11211_zl047

前言 基于Spring Cloud的电子商城系统是面向现代电商场景的分布式微服务解决方案&#xff0c;旨在解决传统单体架构在高并发、可扩展性、灵活性等方面的瓶颈一、项目介绍 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;to…...

Java面试题知识图谱构建:利用PyTorch 2.8图神经网络(GNN)技术

Java面试题知识图谱构建&#xff1a;利用PyTorch 2.8图神经网络&#xff08;GNN&#xff09;技术 1. 引言&#xff1a;Java面试题的痛点与解决方案 对于准备Java面试的开发者来说&#xff0c;最大的挑战不是找不到学习资料&#xff0c;而是面对海量分散的知识点无从下手。JVM…...

AMA-SAM:用于高保真组织学细胞核分割的对抗性多域对齐万物分割模型/文献速递-多模态医学影像最新进展

2026.4.8本文提出了AMA-SAM框架&#xff0c;通过引入条件梯度反转层&#xff08;CGRL&#xff09;实现鲁棒的多域对齐&#xff0c;并设计高分辨率解码器&#xff08;HR-Decoder&#xff09;以保留精细细节&#xff0c;从而增强了万物分割模型&#xff08;SAM&#xff09;在高分…...

免费使用云服务器训练深度学习模型

目前应该有很多课程设计或者毕业设计都是关于深度学习的&#xff0c;如果电脑上没有GPU的话训练一个模型需要很长时间&#xff0c;但是目前可以从很多云服务器上免费额度进行训练&#xff08;新用户&#xff09;&#xff0c;这里记录一下使用腾讯云免费进行模型训练的流程&…...

Zookeeper 选举机制解析

zk中有两种角色&#xff1a;Leader 和 FllowerLeader是集群各台电脑投票选举出来的。事务【非常重要】&#xff1a;一通操作&#xff0c;要么同时成立&#xff0c;要么都不成立。zookeeper:Leader&#xff1a;Zookeeper 集群工作的核心。1、事务请求&#xff08;写操作&#xf…...

BiliTools终极指南:2026年跨平台B站资源下载解决方案

BiliTools终极指南&#xff1a;2026年跨平台B站资源下载解决方案 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 你…...

Spring AI Alibaba vs. AgentScope:两个阿里AI框架,如何选择?

Spring AI Alibaba vs. AgentScope&#xff1a;两个阿里AI框架&#xff0c;如何选择&#xff1f;发布日期&#xff1a;2026年4月9日前言 最近技术圈中&#xff0c;阿里巴巴开源的 Spring AI Alibaba 和 AgentScope 引发广泛讨论。两者同为阿里出品&#xff0c;但设计哲学和应用…...