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 ...
这比使用翻译快很多,而且不会改变原始文件。
我有一个在 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 ...
这比使用翻译快很多,而且不会改变原始文件。