linux-command-substitution(命令替换)

news/2024/10/19 14:49:58

linux-command-substitution(命令替换)

1 什么是命令替换

在有一下情况的时候,会发生命令替换:

$(command)或者是反引号
`command`

这个命令会在子shell中执行,使用标准输出替换掉上面的命令文本。并且在管道关闭或者子进程终止前,shell会一直等待。

2 命令替换时为什么把换行变成了空格

shell读取的输出会以空格作为分隔符进行解析。
不过你可以通过从新设定 IFS 字段来重新指定分隔符。

比如说现在有一个文本文件:

wudanyang@dy-turbo-vm:~/workspace$ cat links.txt
123
456
789

把文件内容实用命令替换成一个变量之后,文本输出是以空格分隔的,换行符被替换掉了

wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo $a
123 456 789

但是如果在输出的时候使用双引号括起来,那么换行符就会被保留下来:

wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo "$a"
123
456
789

3 读取文件的时候空格被当成了分隔符

当有这样一个文件:

$ cat links.txt
hello world
today is weekend
so happy

直接输出是这样的:

wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo $a
hello world today is weekend so happy

如果直接读取的话,因为默认空格是分隔符,所以会认为这是很多行

$ for i in $(cat links.txt); do echo $i; done
hello
world
today
is
weekend
so
happy

3.1 使用双引号解决

使用双引号可以解决这个问题,不实用shell的字符处理,而是使用双引号的字符处理逻辑:

for i in "$(cat links.txt)"; do echo "$i"; done
hello world
today is weekend
so happy

3.2 使用 IFS 修改默认分隔符

当然也可以使用 IFS,把默认的分隔符修改掉,但是记得要还原回来, 不然可能执行别的程序会有问题

oriIFS=$IFS;IFS=$'\n'; for i in $(cat links.txt); do echo $i; done;IFS=$oriIFS;
hello world
today is weekend
so happy

3.3 使用管道+read指令

The read utility shall read a single logical line from standard input into one or more shell variables.

cat links.txt | while read i; do echo $i; done
hello world
today is weekend
so happy

4 小结

可以看到命令替换的字符串还是有一些弯弯绕绕的,所以,一般情况下,就不要使用命令替换,而是直接使用管道,或者就不使用shell了

5 参考

命令替换 2.6.3 Command Substitution : Shell Command Language
shell - 为什么使用命令替换时换行符会丢失? - Unix 和 Linux 堆栈交换 --- shell - Why do newline characters get lost when using command substitution? - Unix & Linux Stack Exchange

阅读(1p) - Linux 手册页 --- read(1p) - Linux manual page

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73450.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

航飞参数计算

作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家…

第4课 SVN

1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式管理。 2.snv的作用: 在项目中对需求规格说明书,测试用例,代码,以及项目项目的文件进项管理和分享。 3、svn…

npm run的时候报错: this[kHandle] = new _Hash(algorithm, xofLen);

在前面加入以下配置信息 set NODE_OPTIONS=--openssl-legacy-provider && 后面跟原来的启动配置信息 凡哥,别他妈吹牛逼了

MiGPT让你的小爱音响更聪明hA

合集 - 经验分享(29)1.记一次由于操作失误致使数据库瘫痪的故障分析与解决方案2023-09-082.网络之谜:记一次失败排查的故事2023-11-153.你是否想知道如何应对高并发?Go语言为你提供了答案!2023-12-294.2023年终总结:拉帮结伙,拼搏探索新机遇2023-12-305.谁说后端不能画出美…

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…

链路与应用负载

为什么需要负载 如今越来越多的服务选择上云 加入到互联网 方便人们的使用 人们对服务的访问质量要求更高 对于高可靠性:电源: 往往采取双电源模式 当电源出现故障 网络不会陷入瘫痪线路: 有静态聚合 将多条线路逻辑变成一条线路 数据包会负载均衡的形式从多条逻辑成一条的链路…

HTTP客户端框架之UniHttp讲解

目录1 UniHttp1.1 简介1.1.1 前言1.1.2 简介1.2 简单使用1.2.1 引入依赖1.2.2 对接接口1.2.3 声明定义 HttpAPI 包扫描路径1.2.4 依赖注入使用即可1.3 说明介绍1.3.1 @HttpApi注解1.3.2 @HttpInterface注解1.3.3 @Par注解1.3.3.1 @QueryPar注解1.3.3.2 @PathPar注解1.3.3.3 @He…