String 似乎无法打印

String 似乎无法打印,string,bash,printf,echo,String,Bash,Printf,Echo,遇到了另一个路障。我将生成如下所示的文本。 当我在没有变量的情况下运行脚本时,我得到以下结果: <array> <dict> <key>cfurl_string</key> <string></string> </dict> <dict> <key>cfurl_string</key> <string></string> </dict&g

遇到了另一个路障。我将生成如下所示的文本。

当我在没有变量的情况下运行脚本时,我得到以下结果:

<array>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
</array>
但是如果我在打印变量的情况下运行该命令,它会导致它的行为异常,除了循环中的最后一个值

.app</string>lications/GarageBand
</dict>
<dict>
 <key>cfurl_string</key>
.app</string>lications/Microsoft Word
</dict>
<dict>
 <key>cfurl_string</key>
 <string>/Applications/Microsoft Excel.app</string>
</dict>
</array>

我试过欺骗它,但一旦我按照我想要的方式得到它,它就会表现得很奇怪。任何帮助都将不胜感激

将循环替换为while:

while IFS="," read i
do
 printf '<dict>\n'
 printf ' <key>cfurl_string</key>\n'
 printf ' <string>'
 printf ' <string>%s</string>\n' "$i"
 printf '</string>\n'
 printf '</dict>\n'
done < "$1"
printf "</array>\n"

检查您的csv文件中是否有不可打印的字符:cat-A file.csv或cat-v file.csv


如果您发现类似^M的内容,那么我建议:dos2unix file.csv✗ cat-v dockcsv.csv/Applications/Launchpad^M/Applications/Safari^M/Applications/Pages^M/Applications/Numbers^M/Applications/Keynote^M/Applications/Photos^M/Applications/iMovie^M/Applications/microsoftword^M/Applications/microsoftexcel%很明显,你已经有了CRLFs-DOS风格的新词-about.BTW,请参阅.rookie错误的“询问问题代码之前”部分中的第一项,这将非常有帮助。注意并欣赏阅读这些:echo-n是不必要的不可移植的-Shell不需要使用-n做任何事情,只需要将它作为字符串打印在标准输出上。使用printf“%s”$i打印$i而不使用换行符更安全。请参阅,特别是应用程序用法和基本原理部分。也就是说,由于您已经在使用printf,因此可以使用printf“%s\n”$i。这并不是说这将有助于解决因误载返回造成的OP问题。我同意你的看法,我必须写信给FastYea,我正在获取^m,现在安装dos2unix,并将向你汇报。如果你没有dos2unix,有很多其他方法可以解决这个问题。在vim中打开文件并运行:在保存之前设置fileformat=unix将完成这个技巧。哇,这实际上为我解决了这个问题。。。我从来没有想到会是这样。这是常见的吗?是的,如果文件是在Windows系统上创建的。
<array>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
<dict>
 <key>cfurl_string</key>
 <string></string>
</dict>
</array>
.app</string>lications/GarageBand
</dict>
<dict>
 <key>cfurl_string</key>
.app</string>lications/Microsoft Word
</dict>
<dict>
 <key>cfurl_string</key>
 <string>/Applications/Microsoft Excel.app</string>
</dict>
</array>
while IFS="," read i
do
 printf '<dict>\n'
 printf ' <key>cfurl_string</key>\n'
 printf ' <string>'
 printf ' <string>%s</string>\n' "$i"
 printf '</string>\n'
 printf '</dict>\n'
done < "$1"
printf "</array>\n"