首页 > 系统相关 >linux-command-substitution(命令替换)

linux-command-substitution(命令替换)

时间:2024-10-19 14:43:27浏览次数:1  
标签:shell links substitution cat command linux dy txt 替换

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

标签:shell,links,substitution,cat,command,linux,dy,txt,替换
From: https://www.cnblogs.com/wudanyang/p/18475872

相关文章

  • Linux系统重建Grub引导的方法
    一、问题出现的原因在安装双系统时,我们都是先安装Windows系统,再安装Linux系统,这样在启动计算机时,两个系统都可以被引导启动,并在开机界面可以进行选择。这是因为Linux使用的操作系统引导加载器Grub可以引导如Windows、Linux等多种操作系统,但是Windows的操作系统引导加载器不能......
  • Linux下丝滑使用docker
    安装docker安装由debian维护的docker.io,参考https://www.kali.org/docs/containers/installing-docker-on-kali/sudoaptupdatesudoaptinstalldocker.iosudosystemctlenabledocker--now为普通用户添加docker的权限sudousermod-aGdocker$USER更改docker镜像(......
  • Linux内核调优参数配置
    在Linux中,内核调优涉及到对系统内核的各种参数进行优化,以适应不同的工作负载和场景。这些参数主要存储在两个地方:一个是运行时动态可调的/proc/sys目录下的文件,另一个是持久化的配置文件/etc/sysctl.conf。1.内核调优配置文件/etc/sysctl.conf:这是最常用的内核参数配置文件,用......
  • Linux指定dns服务器解析某个域名
    在Linux中,指定DNS服务器来解析某个域名主要涉及编辑DNS配置文件或使用命令行工具进行临时配置。以下是详细的步骤和说明:一、编辑DNS配置文件(永久生效)Linux系统中,DNS解析的配置通常位于/etc/resolv.conf文件中。你可以通过编辑这个文件来指定DNS服务器。步骤:打开/etc/resolv.......
  • Linux查看系统的历史负载
    在Linux中,你可以使用top命令或uptime命令来查看系统的历史负载。top命令:top命令是一个实时的系统监控工具,它可以显示系统进程的动态实时视图,包括CPU和内存的使用情况。要查看历史负载,你可以在top命令中按Shift+H(在某些版本中可能是H)来切换显示模式,显示所有CPU的平均负载,而不......
  • linux上编译运行c程序
    创建test文件,进入该目录后创建hello.c文件使用vimhello.c命令编辑hello.c文件编写完成后保存该文件,使用gcc进行编译并生成可执行程序在终端中执行输入./hello执行相关代码......
  • linux configure命令
    Linuxconfigure命令精通:一个完整的初学者教程 configure命令语法和选项取决于具体的软件包。一般来说,configure命令的基本语法如下:./configure[options]./configure是执行configure命令的命令行,[options]表示配置命令的选项,常见选项:--prefix=DIR:指定软件安装的目录,默认是/......
  • Linux命令汇总
    一.系统指令1.ifconfig查看IP地址2.sshIP地址连接虚拟机3.cat/etc/passwd查看用户;cat/etc/group查看系统中用户组;useradd添加用户;userdel删除用户;groupadd添加组名4.su切换用户5.pwd查看当前路径6.df查看磁盘使用情况;df-h带单位显示磁盘使用情况7.top查看......
  • Linux系统命令3
    1、df查看磁盘使用情况Filesystem:代表该文件系统时哪个分区,所以列出的是设备名称。1K-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变单位大小,也可以用-B来设置。Used:已经使用的空间大小。Available:剩余的空间大小。Use%:磁盘使用率。如果使用率在90%以上时,就需要注意了,避......
  • Linux 之 fdisk 【磁盘分区管理】
    删除分区1.查看磁盘信息lsblk 2.删除分区sdb硬盘下的所有分区#1进入d的磁盘分区fdisk/dev/sdb#2输入p查看磁盘的分区信息#3输入d进入删除磁盘分区命令#4选择要删除的分区号重复3,4全部删除#5w保存退出并生效操作信息(输入q直接退出不生效操作信息)......