如何修剪Bash变量的空格?

我有这个代码的shell脚本:

var=`hg st -R "$path"`
if [ -n "$var" ]; then
    echo $var
fi

但是条件代码总是执行,因为hg st总是打印至少一个换行符。

  • 有没有简单的方法来从$var删除空白(如PHP中的trim() )?
  • 要么

  • 有没有处理这个问题的标准方法?
  • 我可以使用sed或AWK,但我想认为这个问题有更优雅的解决方案。


    我们来定义一个包含前导,尾随和中间空格的变量:

    FOO=' test test test '
    echo -e "FOO='${FOO}'"
    # > FOO=' test test test '
    echo -e "length(FOO)==${#FOO}"
    # > length(FOO)==16
    

    如何删除所有空格(在tr中用[:space:]表示):

    FOO=' test test test '
    FOO_NO_WHITESPACE="$(echo -e "${FOO}" | tr -d '[:space:]')"
    echo -e "FOO_NO_WHITESPACE='${FOO_NO_WHITESPACE}'"
    # > FOO_NO_WHITESPACE='testtesttest'
    echo -e "length(FOO_NO_WHITESPACE)==${#FOO_NO_WHITESPACE}"
    # > length(FOO_NO_WHITESPACE)==12
    

    如何仅删除前导空格:

    FOO=' test test test '
    FOO_NO_LEAD_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//')"
    echo -e "FOO_NO_LEAD_SPACE='${FOO_NO_LEAD_SPACE}'"
    # > FOO_NO_LEAD_SPACE='test test test '
    echo -e "length(FOO_NO_LEAD_SPACE)==${#FOO_NO_LEAD_SPACE}"
    # > length(FOO_NO_LEAD_SPACE)==15
    

    如何只删除尾部空白:

    FOO=' test test test '
    FOO_NO_TRAIL_SPACE="$(echo -e "${FOO}" | sed -e 's/[[:space:]]*$//')"
    echo -e "FOO_NO_TRAIL_SPACE='${FOO_NO_TRAIL_SPACE}'"
    # > FOO_NO_TRAIL_SPACE=' test test test'
    echo -e "length(FOO_NO_TRAIL_SPACE)==${#FOO_NO_TRAIL_SPACE}"
    # > length(FOO_NO_TRAIL_SPACE)==15
    

    如何删除前导和尾随空格 - 链接sed s:

    FOO=' test test test '
    FOO_NO_EXTERNAL_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
    echo -e "FOO_NO_EXTERNAL_SPACE='${FOO_NO_EXTERNAL_SPACE}'"
    # > FOO_NO_EXTERNAL_SPACE='test test test'
    echo -e "length(FOO_NO_EXTERNAL_SPACE)==${#FOO_NO_EXTERNAL_SPACE}"
    # > length(FOO_NO_EXTERNAL_SPACE)==14
    

    另外,如果你的bash支持它,你可以替换echo -e "${FOO}" | sed ... echo -e "${FOO}" | sed ... sed ... <<<${FOO} (尾随空格):

    FOO_NO_TRAIL_SPACE="$(sed -e 's/[[:space:]]*$//' <<<${FOO})"
    

    一个简单的答案是:

    echo "   lol  " | xargs
    

    Xargs会为你做修剪。 这是一个命令/程序,没有参数,返回修剪过的字符串,就这么简单!

    注意:这不会删除内部空间,所以"foo bar"保持不变。 它不会变成"foobar"


    有一种解决方案只使用Bash内置的名为通配符:

    var="    abc    "
    # remove leading whitespace characters
    var="${var#"${var%%[![:space:]]*}"}"
    # remove trailing whitespace characters
    var="${var%"${var##*[![:space:]]}"}"   
    echo "===$var==="
    

    以下是包含在一个函数中的相同内容:

    trim() {
        local var="$*"
        # remove leading whitespace characters
        var="${var#"${var%%[![:space:]]*}"}"
        # remove trailing whitespace characters
        var="${var%"${var##*[![:space:]]}"}"   
        echo -n "$var"
    }
    

    您将字符串以引用的形式进行修剪。 例如:

    trim "   abc   "
    

    这个解决方案的一个好处是,它可以与任何POSIX兼容的shell一起工作。

    参考

  • 从Bash变量中删除前导和尾部空白(原始源)
  • 链接地址: http://www.djcxy.com/p/57075.html

    上一篇: How to trim whitespace from a Bash variable?

    下一篇: How to pass command line arguments to a shell alias?