如何在一个回显中大写和替换 shell 脚本中的字符

问题描述

我试图找到一种方法来在一个回声中大写和替换字符串的破折号。我无法使用多行重新分配字符串值。

例如: string='test-e2e-uber' 需要 echo $string 作为 TEST_E2E_UBER

我目前可以通过利用来做一个或另一个

${string^^} 表示大写

${string//-/_} 用于替换

但是,当我尝试将它们组合起来时,它似乎不起作用(错误替换错误)。 是否有正确的语法来实现这一点?

echo ${string^^//-/_}

解决方法

这不会直接回答您的问题,但仍然可以通过以下脚本实现您想要的:

declare -u string='test-e2e-uber'
echo ${string//-/_}
,

为什么你如此不喜欢有两个连续的赋值语句?如果你真的讨厌它,你将不得不恢复到一些外部程序来为你完成任务,例如

string=$(tr  a-z- A-Z_ <<<$string)

但我认为为如此简单的操作创建子进程是一种资源浪费。

,
  1. 您可以直接使用 'tr' 命令完成此操作,只需一个 'echo'
echo "$string" | tr "-" "_" | tr "[:lower:]" "[:upper:]"
TEST_E2E_UBER

我不认为 'tr' 只允许在一个命令中转换 2 个对象,所以我使用管道进行输出重定向

  1. 或者你可以用 'awk' 做类似的事情
echo "$string" | awk '{gsub("-","_",$0)} {print toupper($0)}'
TEST_E2E_UBER

在这种情况下,我用“gsub”替换连字符,然后我将整个记录打印为大写