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的内置变量,IFS是一个字符串,里面的每一个字符都会用来作为分隔符进行单词分割。 IFS变量只在当前shell起作用。 一、对$*的影响 先做参数替换把$*替换成参数列表。相当于args[] 然后下面分两种情况: (1)…...
Java学习线路图--书籍推荐
----基础---- 《Java从入门到精通》 ----进阶---- 一 《Java项目开发全程实录》《Java开发实例大全(基础篇)》《Java开发实例大全(提高篇)》 二 《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系统下安装步骤
第一步:登录官网 官网地址:www.rabbitmq.com,点击Get Started 重要信息:RabbitMQ Tutorials手册,描述了工作模式 第二步:点击Download Installation下载 重要信息:rabbitmq是用erlang语言开发的࿰…...
阿里测试员晒薪资条,看完真的扎心了...
前几天,有位老粉私信我,说看到某95后学弟晒出阿里的工资单,他是真酸了…想狠补下技术,努力冲一把大厂。 为了帮到他,也为了大家能在最短的时间内做面试复习,我把软件测试面试系列都汇总在这一篇文章了。 …...
内网渗透辅助工具集Yasso
目录 介绍 工具优势 程序功能模块 目前已有用功能模块 使用例子 工具下载</...
Spring笔记(1):概述
1、什么是Spring? Spring是最受欢迎的企业级Java应用程序开发框架,使用它创建性能好、易于测试、可重用的代码。Spring是一种轻量级的框架。Spring框架的核心特性是开发任何Java应用程序,其目标是使得J2EE开发变得更容易,通过启用…...
工程机械焊接件焊接结构件三维扫描检测外观质量控制-CASAIM三维扫描检测仪
焊接已发展为制造业中的一种重要的加工方法,广泛应用于航空、航天、冶金、石油、汽车制造以及国防等领域。工程机械焊接件品种繁多、几何形状复杂,焊接件质量的好坏将直接影响到产品的使用寿命长短。对焊缝表面尺寸测量及评定表面焊缝缺陷时,…...
使用linux部署项目步骤
文章目录前言一、服务器环境配置二、数据库导入三、项目打包1、修改项目中的访问路径2、修改db.properties的数据库访问路径3、打包4、修改配置,启动服务四、测试总结前言 今天学习了在服务器中部署项目,记录一下 一、服务器环境配置 首先要安装VMware&…...
pt02-list-tuple-dir
容器类型 通用操作 数学运算符 (1) 用于拼接两个容器 (2) 用原容器与右侧容器拼接,并重新绑定变量 (3) * 重复生成容器元素 (4) * 用原容器生成重复元素, 并重新绑定变量 (5) !:依次比较两个容器中元素,一但不同则返回比较结果。< < > > 意…...
高端电器新十年,求解「竞速突围」
竞争激烈的高端电器品牌们,平时王不见王,但也有例外。海尔、博西、海信、创维、方太、老板等等近乎中国电器行业所有一线品牌副总裁级别以上高层,2月22日都现身于上海,来参加一场由红星美凯龙攒起来的高端电器局,2023中…...
[Android Studio] Android Studio使用keytool工具读取Debug 调试版数字证书以及release 发布版数字证书
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…...
2023年金三银四必备软件测试常见面试题1500问!!!【测试思维篇】
五、测试思维5.1 打电话功能怎么去测?我们会从几个方面去测试:界面、功能、兼容性、易用性、安全、性能、异常。1)界面我们会测试下是否跟界面原型图一致,考虑浏览器不同显示比例,屏幕分辨率。2)功能&#…...
推荐四款自用的电脑神器
作为一个经常鼓捣电脑的小编来说,无论是写文章、截图、办公方面都缺少不了一些好用的软件,今天就给大家盘点一些我推荐用的办公效率工具,让你的效率事半功倍。 写文章神器 以前写文章一直是在公众号编辑上直接写的,缺点就是格式有…...
CSDN 竞赛 32 期
CSDN 竞赛 32 期1、题目名称:传奇霸业2、题目名称:严查枪火3、题目名称:蚂蚁家族4、题目名称:运输石油小结1、题目名称:传奇霸业 传奇霸业,是兄弟就来干。 小春(HP a)遇到了一只黄金哥布林(HP x)。 小春每…...
【路径规划】基于前向动态规划算法在地形上找到最佳路径(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
spring boot maven打包jar包太大,怎么办?这个方法解决你的烦恼
在springboot maven项目中,有两种打包方式,一种是war包,一种是jar,今天我们讲一下jar的打包方式。但是在jar包打包只要我们发现,我们的项目jar太大了,每次上传到服务器的时候非常的慢,接下来我们…...
Spring之AOP理解及使用
文章目录AOP是什么AOPSpring的通知类型1.Before通知2. AfterReturning通知3.AfterThrowing通知4. After通知5. Around通知动态代理JDK动态代理CGLib动态代理动态代理的代码展示AOP使用切面类的配置最后大家好,我是Leo!今天给大家带来的是关于Spring AOP的…...
微信小程序和webview使用postMessage交互
小程序和webview能交互,但是没有你想的那个完美小程序向webview传递参数只能使用url携带参数webview向小程序传递参数可以使用postMessage, 但是注意了,postMessage只会在特定的时机执行,请看官方文档由此可见,如果你想点击webvie…...
pytorch-自动求导机制,构建计算图进行反向传播,需要注意inplace操作导致的报错,梯度属性变化
PyTorch 作为一个深度学习平台,在深度学习任务中比 NumPy 这个科学计算库强在哪里呢?一是 PyTorch 提供了自动求导机制,二是对 GPU 的支持。由此可见,自动求导 (autograd) 是 PyTorch,乃至其他大部分深度学习框架中的重…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
