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

时间:2019-04-26 14:59:53

标签: bash docker centos chown

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

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

我可以从这个特定的变量中删除回车符,但是很好奇我如何避免所有问题/我是怎么引起的,因为我感觉它可能会导致其他当前不可见的问题。

#!/bin/bash

dirname=$(dirname $0)
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=stackoverflow
log=/opt/program-root/logs

错误是

chown: invalid spec: 'stackoverflow\r:'

2 个答案:

答案 0 :(得分:2)

您的文件具有Windows样式的行尾。最简单的解决方法:

dos2unix ./${input_properties}

答案 1 :(得分:1)

只需告诉read命令\r输入字段分隔符

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

这比使用翻译快得多,并且不会更改原始文件。