删除从 Bash 中的输入文件读取的回车符 returns

Remove carriage returns read from input file in Bash

Bash 脚本:

#!/bin/bash

set -x
parent_folder=$(dirname $PWD)

// read from project-list file and assign to array
mapfile -t arr <project-list.txt

for i in "${arr[@]}"; do
   cd "$parent_folder/$i"
done

问题:bash: cd: $'/d/workspace/node/notification-service\r': Not a directory。正在添加 \r。如何预防?

如果由于某种原因不能从 project-list.txt 中删除它们(否则这个问题就没有任何意义),请在扩展 arr.

时删除它们
for i in "${arr[@]%$'\r'}"; do
  ...

您可以更改 mapfile 语句以先使用 tr 删除 \r

mapfile -t arr < <(tr -d '\r' < project-list.txt)

之后检查数组内容使用:

declare -p arr

如何预防?

取决于您所说的预防是什么意思。首先,我不会将它们放入项目-list.txt。一定是在某个地方以某种方式创建了这个文件,并且很少有真正需要在文件中包含回车符 returns 。预防将从这里开始。

如果出于某种原因无法做到这一点,您可以通过 dos2unix:

运行 文件
mapfile -t arr <(dos2unix project-list.txt)

或者,如果 git-bash 不支持进程替换(我没有安装它,所以我不能尝试这个),你做一个

dos2unix <project-list.txt >project-list.sanitized
mapfile -t arr <project-list.sanitized