如何使用 IFS 删除 \r?

How to remove \r using IFS?

我正在编写如下代码片段:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$v
            ;;
    esac
done 9< <(git show -s --format=%b)

但我看到 $v 仍然包含 \r。从 https://bash.cyberciti.biz/guide/$IFS,我读到 A sequence of IFS whitespace characters is also treated as a delimiter. 我所做的不应该从行中删除尾随 \r 吗?

由于您正在格式化 git show 的输出,因此请在 git 格式字符串中使用 null 定界符 %x00,这永远无法在 shell变量:

while IFS=$': \t' read -r -u9 marker v
do
  case $marker in
    Release)
      export RELEASE="$v"
      ;;
  esac
done 9< <( git show -s --format='%b%x00' )

您可以这样更改 read :

read -r -u9 marker v possibly_something_else;

这样 $v 就不会包含 \r

我使用 tr 删除尾随 \r。这是我的最终解决方案:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$(echo $v | tr -d '\r\t')
            ;;
    esac
done 9< <(git show -s --format=%b)