是否可以在 BASH 中组合一个变量的两个或多个字符串操作功能(或任何其他标准 Linux 命令)?
假设例如$XDG_CURRENT_DESKTOP
我有一个保存字符串的变量ubuntu:GNOME
。现在,我可以通过→
检索第二个子字符串。我还可以通过→ 检索小写字符串。${XDG_CURRENT_DESKTOP##*:}
GNOME
${XDG_CURRENT_DESKTOP,,}
ubuntu:gnome
但是我怎样才能将这两个功能结合起来(→ gnome
)在一–简单的– 命令而不使用重定向到、sed
或任何其他这些 –awk
grep
相当重– 命令且无需额外的缓冲存储步骤?例如:
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 在命令退出后保持不变,然后将它的输入分隔为并将结果保存在两个变量和中。请注意,如果输入中的同一行有多个,将具有第一行之前的所有内容和其他所有内容。最后,是一个“此处字符串”,这是一种将变量作为输入传递给命令的简单方法。$variable
IFS=':' read
:
read
read var1 var2
:
var1
var2
:
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
函数part2
和lc
修改传递给它们的变量名,而无需分叉。最后,原始变量(fred
)已被修改。但您仍然需要额外的变量。
另一种方法可以在 bash4 上运行,如下所示:
part2() { printf "%s" "${1#*:}"; }
lc() { printf "%s" "${1,,}" ; }
fred="ubuntu:GNOME"
printf "%s\n" "$(lc "$(part2 "$fred")")"
它不会修改任何变量(它只操作值),但它会创建额外的分支。