📜  使用 sed 分配变量不起作用 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:36:34.198000             🧑  作者: Mango

使用 sed 分配变量不起作用 - Shell-Bash

在 Shell-Bash 编程中,使用 sed 命令进行字符串替换是非常常见的操作。但是有时候,我们在使用 sed 命令分配变量时会遇到一些问题,导致变量没有被正确地赋值,本文将从以下几个方面向大家介绍这个问题:

  • 问题原因
  • 解决方案
  • 示例代码
  • 总结
问题原因

在 Shell-Bash 编程中,我们可以使用 sed 命令将某个字符串替换成我们需要的字符串,同时,我们还可以利用sed命令将替换后的字符串赋值给一个变量。下面是一个示例代码:

#!/bin/bash

str="hello world"
new_str=$(echo $str | sed 's/hello/hi/')
echo $new_str

上面的代码将 hello world 中的 hello 替换成了 hi 并将结果赋值给 new_str,最后输出这个变量的值。但是,当我们将上面的代码保存成 test.sh 并执行时,发现并没有正确输出 hi world。这是为什么呢?

原因就是 sed 命令中的替换操作会在新的子进程中执行,而赋值操作却是在主进程中执行,这就导致了变量没有被正确地赋值。

解决方案

为了解决这个问题,我们需要将 sed 命令的输出重定向到标准输出中,这样主进程就能正确获取到输出值并将其赋值给变量。

以下是修改后的示例代码:

#!/bin/bash

str="hello world"
new_str=$(echo $str | sed 's/hello/hi/' 2>&1)
echo $new_str

上面的代码使用了 2>&1sed 命令的标准错误输出重定向到标准输出,这样就能确保在主进程中正确地获取到输出值并将其赋值给变量。

示例代码

以下是完整的示例代码:

#!/bin/bash

str="hello world"
new_str=$(echo $str | sed 's/hello/hi/' 2>&1)
echo $new_str
总结

在 Shell-Bash 编程中,使用 sed 命令分配变量时,需要注意 sed 命令的子进程和主进程之间的区别,并将输出重定向到标准输出中,以确保变量能正确地被赋值。