我知道这个问题已经有一个重复的问题。如何从一个Bash变量中修剪空格?.
我读了那里所有的答案,但我有一个关于另一个解决方案的问题,我想知道这是否可行。
这是我认为可行的解决方案。
a=$(printf "%s" $a)
下面是一个演示。
$ a=" foo "
$ a=$(printf "%s" $a)
$ echo "$a"
foo
如果变量a在一开始就设置了类似"-e", "-n "这样的选项,根据你以后如何处理你的结果,用户可能会破坏你的脚本:-e选项允许echo解释反斜线的东西。
即使在你只想显示变量a的情况下,-n也会搞乱你的布局。
你可以考虑使用regex来检查你的变量是否以'-'开头,并且后面跟着一个可用的echo选项(-n, -e, -E, --help, --version)。
当输入的非空格字符之间包含空格时,它就会失败。
$ a=" foo bar "
$ a=$(printf "%s" $a)
$ echo "$a"
foobar
预期的输出是下面的结果。
foo bar
你可以使用Bash内置的模式替换。注意: Bash模式替换使用 "路径名扩展"(glob)模式匹配, 而不是正则表达式. 我的解决方案需要启用可选的shell行为extglob (shopt -s extglob).
$shopt -s extglob
$ a=" foo bar "
$ echo "Remove trailing spaces: '${a/%*([[:space:]])}'"
Remove trailing spaces: ' foo bar'
$ echo "Remove leading spaces: '${a/#*([[:space:]])}'"
Remove leading spaces: 'foo bar '
$ echo "Remove all spaces anywhere: '${a//[[:space:]]}'"
Remove all spaces anywhere: 'foobar'
参考Bash手册页面EXPANSION部分的 "参数扩展"(模式替换)和 "路径名扩展 "子节。