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

问题描述 投票:0回答:2

我有一个环境设置脚本,我在docker容器中构建。它需要一个属性文件,它是key = value对,然后通过并使用它们来创建一个环境。我遇到的问题是当我尝试向用户提示时(从属性中提取的值),它出现为“user \ r \ n”,这会在chown上引发错误。

这是在我准备的docker环境中执行的 - CentOS:7 base。来自属性文件的userID被拉出,作为容器中的用户创建,并且可以访问轮组(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来自input-properties文件:

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

而错误是

chown: invalid spec: 'stackoverflow\r:'
bash docker centos chown
2个回答
2
投票

您的文件具有Windows样式的行结尾。最容易修复:

dos2unix ./${input_properties}

1
投票

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

while IFS=$' \t\r\n' read -r line; do ...

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

© www.soinside.com 2019 - 2024. All rights reserved.