Bash 脚本错误地将 \r 合并到变量中

Bash script incorrectly incorporating \r into variable

我有一个在 docker 容器中构建的环境设置脚本。它需要一个属性文件,该文件是键=值对,然后遍历并使用它们来创建环境。我遇到的问题是当我尝试 chown 用户(从属性中提取的值)时,它显示为 "user\r",这在 chown 上引发错误。

这是在我准备的 docker 环境中执行的 - CentOS:7 基地。提取属性文件中的 userID,在容器中创建为用户,并授予对 wheel 组的访问权限 (usermod -aG wheel $user),因此他们在容器中具有权限。

我可以从这个特定的变量中删除回车 return,但很好奇我如何才能一起避免这个问题/我是如何引起它的,因为我觉得它可能会导致其他目前不可见的问题.

#!/bin/bash

dirname=$(dirname [=11=])
input_properties="input-properties"
...
while read -r line; do declare -x "$line"; done <${dirname}/${input_properties}
...
$SUDO mkdir -p $log
...
$SUDO chown -R $app_user: $log

其中 $app_user 和 $log 来自输入属性文件:

app_user=Whosebug
log=/opt/program-root/logs

错误是

chown: invalid spec: 'Whosebug\r:'

您的文件有 Windows 样式的行结尾。最简单的修复:

dos2unix ./${input_properties}

简单地告诉 read 命令 \r 输入字段分隔符

的一部分
while IFS=$' \t\r\n' read -r line; do ...

这比使用翻译快很多,而且不会改变原始文件。