我在 BASH shell 中遇到了变量替换的问题。
假设您定义了一个变量a
。然后命令
$> echo ${a//[0-4]/}
Run Code Online (Sandbox Code Playgroud)
打印其值,并删除所有介于 0 和 4 之间的数字:
$> a="Hello1265-3World"
$> echo ${a//[0-4]/}
Hello65-World
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,但让我们看看下一个例子:
$> b="?1265-3?"
$> echo ${b//[0-4]/}
?1265-3?
Run Code Online (Sandbox Code Playgroud)
没有发生替换:我认为这是因为b
包含 CJK 字符。这个问题扩展到所有涉及方括号的情况。令人惊讶的是,没有方括号的变量替换在两种情况下都可以正常工作:
$> a="Hello1265-3World"
$> echo ${a//2/}
Hello165-3World
$> b="?1265-3?"
$> echo ${b//2/}
?165-3?
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我错过了什么?
我使用 Lubuntu 12.04,终端是lxterminal
并echo $BASH_VERSION
返回 4.2.24(1)-release。
编辑: 安德鲁约翰逊在他的评论中表示,使用gnome-terminal
4.2.37(1)-release 命令可以正常工作。我想知道这是否是lxterminal
其特定的 4.2.24(1)-release 版本的问题。
编辑:我gnome-terminal
在 Lubuntu 12.04 上尝试过,但问题仍然存在......
我知道这会tput sc
保存当前的光标位置并tput rc
准确地将其恢复到tput sc
被调用的位置。问题是每次tput sc
调用时,它都会覆盖之前保存的位置。
有没有一种方法,以节省更多的位置,例如tput sc pos1
并且tput sc pos2
可与,比如说可以恢复,tput rc pos1
并tput rc pos2
分别?(解决方案不需要使用tput
,我提到它是因为它是我知道的唯一处理光标位置的命令)
如果没有,有没有办法至少在函数中本地保存光标位置,以便如果一个函数使用tput sc
然后调用另一个再次运行的函数tput sc
,那么每个函数在调用时都会恢复自己保存的光标位置tput rc
?
提前致谢。