问:
我有一个包含以下代码的shell脚本:
代码语言:javascript复制var=`hg st -R "$path"`
if [ -n "$var" ]; then
echo $var
fi
但是条件语句总是执行,因为 hg st 总是至少打印一个换行符。
- 有没有一种简单的方法可以从 $var 中删除空格(就像 PHP 中的 trim() )?
- 有处理这个问题的标准方法吗?
我可以使用 sed 或 AWK,但我希望有更优雅的解决方案。
答:
方法一:使用 echo 命令
代码语言:javascript复制#! /bin/bash
var=" test "
var=$(echo -n $var)
echo "|${var}|"
为了更直观地感受 echo 命令的一些处理细节差异,我们可以使用 hexdump 命令以十六进制形式查看其输出,测试截图如下:
其中 echo ${#var} 用于获取字符串变量的长度。0a 是换行符的十六进制值。-n 使 echo 不打印末尾的换行符。
方法二:使用 echo 和 xargs 命令
代码语言:javascript复制#! /bin/bash
var=" test "
var=$(echo $var | xargs)
echo "|${var}|"
上述代码中的 xargs 会删除字符串首尾的空白符,还会将字符串中间连续的多个空格压缩为单个空格。
方法三:使用 Bash 内置函数和通配符
代码语言:javascript复制#! /bin/bash
var=" abc "
# 删除前导空白字符
var="${var#"${var%%[![:space:]]*}"}"
# 删除尾部空白字符
var="${var%"${var##*[![:space:]]}"}"
printf '%sn' "===$var==="
这种方法适用于符合 POSIX 规范的 shell 程序。
参考文档:
- stackoverflow question 369758
- man echo
- xargs命令用法实例
- https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
相关阅读:
- 在Bash中如何检查字符串是否包含子字符串
- 如何在Bash中连接字符串变量
- 为什么要使用xargs命令
- Bash中$$ $! $# $0 $? $* $@ 等各种符号的含义
- 在Bash中如何将字符串转换为小写
更多好文请关注↓