Bash 拆下变量的回车端

Bash 拆下变量的回车端,bash,Bash,这个程序的输出非常奇怪。“回车”在做什么,以及如何删除它——最后缺少一个引号?为什么字母“T”不见了?如何编写代码来更正此问题 我正在使用的代码 #!/bin/bash export DATABASE_LIST="/opt/halogen/crontab/etc/db_stat_list.cfg" export v3="" while read -r USERID ORACLE_SID2 do v3="This is '${ORACLE_SID2}' " echo $v3 done &l

这个程序的输出非常奇怪。“回车”在做什么,以及如何删除它——最后缺少一个引号?为什么字母“T”不见了?如何编写代码来更正此问题

我正在使用的代码

#!/bin/bash

export DATABASE_LIST="/opt/halogen/crontab/etc/db_stat_list.cfg"
export v3=""

while read -r USERID ORACLE_SID2
do
 v3="This is '${ORACLE_SID2}' "
 echo $v3
done < <(tac $DATABASE_LIST)
我从中读取的文件没有损坏,是一个小文件,有两行

[oracle@ot1sldbm001v test2]$ cat /opt/halogen/crontab/etc/db_stat_list.cfg
asp_dba/dba OT1SL010
asp_dba/dba OT1SL80

谢谢

您的数据库列表文件是DOS/Windows格式,每行末尾都有回车+换行符。Unix仅使用换行符作为行终止符,因此Unix工具将回车符视为行内容的一部分。您可以通过告诉
read
命令将回车符视为空格(如空格、制表符等)来避免出现问题,因为
read
会自动删除行首和行尾的空格:

...
while IFS="$IFS"$'\r' read -r USERID ORACLE_SID2
    ...

请注意,由于对
IFS
(基本上列出了空白字符)的赋值是
read
命令的前缀,因此它只适用于该命令,并且不必在之后设置为正常值。

您的数据库列表文件是DOS/Windows格式,每行末尾都有回车+换行。Unix仅使用换行符作为行终止符,因此Unix工具将回车符视为行内容的一部分。您可以通过告诉
read
命令将回车符视为空格(如空格、制表符等)来避免出现问题,因为
read
会自动删除行首和行尾的空格:

...
while IFS="$IFS"$'\r' read -r USERID ORACLE_SID2
    ...

请注意,由于对
IFS
(基本上列出了空格字符)的赋值是
read
命令的前缀,因此它只适用于该命令,不必在之后设置为正常。

您有
这是“OT1SL80”
。。。这将转换为
覆盖
T
。您需要在变量替换发生之前删除CR。我建议用管道连接到
tr-d'\r'
。你有
这是“OT1SL80”
。。。这将转换为
覆盖
T
。您需要在变量替换发生之前删除CR。我建议用管道连接到
tr-d'\r'
。谢谢你,戈登,我花了好几个小时都不认为这是DOS/Windows的问题,尽管我以前遇到过这个问题。也谢谢你的代码。它现在正在工作。我删除了这个文件并重新创建了它。在看到您的修复程序之前,我一直处于修复状态:)谢谢您,戈登,我花了好几个小时不认为这是DOS/Windows问题,尽管我以前遇到过这个问题。也谢谢你的代码。它现在正在工作。我删除了这个文件并重新创建了它。在看到你之前,我一直处于困境:)