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

Jen*_*ens 7 command-line bash scripts environment-variables

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

\n

假设我有一个保存字符串变量。\n现在,我可以通过\xe2\x86\x92检索第二个子字符串。\n我还可以通过\xe2\x86\x92检索小写字符串。$XDG_CURRENT_DESKTOPubuntu:GNOME
${XDG_CURRENT_DESKTOP##*:}GNOME
${XDG_CURRENT_DESKTOP,,}ubuntu:gnome

\n

但是,如何在一个\xe2\x80\x93简单的\xe2\x80\x93 命令中组合这两个函数(\xe2\x86\x92 gnome),而不使用重定向到、或任何其他这些 \xe2\x80\x93相当重量级\xe2\x80\x93 命令并且没有额外的缓冲区存储步骤?例如:sedawkgrep

\n
local mybuffer="${XDG_CURRENT_DESKTOP##*:}"\necho "${mybuffer,,}"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

ter*_*don 4

bash如果您用来read读取两个变量,则可以执行此操作:

$ echo "$XDG_CURRENT_DESKTOP"
ubuntu:GNOME
$ IFS=':' read var1 var2 <<<"${XDG_CURRENT_DESKTOP@L}"
$ echo "$var2"
gnome
Run Code Online (Sandbox Code Playgroud)

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


jrw*_*982 0

这是一个 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"
Run Code Online (Sandbox Code Playgroud)

输出:

gnome
Run Code Online (Sandbox Code Playgroud)

这些函数part2lc修改其名称传递给它们的变量,而无需分叉。最终,原来的变量(fred)被修改了。但你仍然需要额外的变量。

另一种方法应该可以在 bash4 上工作,如下所示:

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

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