BASH:如何在一个步骤中组合两个(或更多)变量字符串操作?

BASH:如何在一个步骤中组合两个(或更多)变量字符串操作?

是否可以在 BASH 中组合一个变量的两个或多个字符串操作功能(或任何其他标准 Linux 命令)

假设例如$XDG_CURRENT_DESKTOP我有一个保存字符串的变量ubuntu:GNOME。现在,我可以通过→
检索第二个子字符串。我还可以通过→ 检索小写字符串。${XDG_CURRENT_DESKTOP##*:}GNOME
${XDG_CURRENT_DESKTOP,,}ubuntu:gnome

但是我怎样才能将这两个功能结合起来(→ gnome简单的– 命令而不使用重定向到、sed或任何其他这些 –awkgrep相当重– 命令且无需额外的缓冲存储步骤?例如:

local mybuffer="${XDG_CURRENT_DESKTOP##*:}"
echo "${mybuffer,,}"

我想避免使用这样的“子脚本”或函数调用构造来实现这一点,我已经尝试了上述两种方法的任意组合,但似乎徒劳无功。还有
其他方法吗?
还是我需要升级 bash?(使用:GNU bash 4.3.11)
或者其他任何 shell 能做到这一点吗?

答案1

bash如果您使用read读取两个变量,则可以这样做:

$ echo "$XDG_CURRENT_DESKTOP"
ubuntu:GNOME
$ IFS=':' read var1 var2 <<<"${XDG_CURRENT_DESKTOP@L}"
$ echo "$var2"
gnome

构造返回转换为小写的${variable@L}的值。然后,将命令的输入字段分隔符设置为,这样全局 IFS 在命令退出后保持不变,然后将它的输入分隔为并将结果保存在两个变量和中。请注意,如果输入中的同一行有多个,将具有第一行之前的所有内容和其他所有内容。最后,是一个“此处字符串”,这是一种将变量作为输入传递给命令的简单方法。$variableIFS=':' read:readread var1 var2:var1var2:var1:var2<<<

答案2

这是一个 bash5(不是 bash4)脚本:

part2() {
   local -n var=$1
   var=${var#*:}
}
lc() {
   local -n var=$1
   var=${var,,}
}
fred="ubuntu:gnome"
part2 fred
lc fred
printf "%s\n" "$fred"

输出:

gnome

函数part2lc修改传递给它们的变量名,而无需分叉。最后,原始变量(fred)已被修改。但您仍然需要额外的变量。

另一种方法可以在 bash4 上运行,如下所示:

part2() { printf "%s" "${1#*:}"; }
lc()    { printf "%s" "${1,,}" ; }
fred="ubuntu:GNOME"
printf "%s\n" "$(lc "$(part2 "$fred")")"

它不会修改任何变量(它只操作值),但它会创建额外的分支。

相关内容