2015-04-01 126 views
3

我要打印,我已经从一个阵列以这种方式分割取得的内容:shell脚本奇怪的回声行为

string="abc test;ABCtest.it" 

IFS=';' read -a array <<< "$string" 
name="${array[0]}" 
url="${array[1]}" 

echo -ne "\n$url,$name" >> "$outputDir/$fileName" 

但输出文件不包含URL部分

我认为问题在于“。”但我不知道如何解决它

如果我试试这个

echo $url 

它的工作!

感谢


我也试过用printf和用硬编码的文件名,但没有!

printf '%s %s\n' "$url" "$name" >> test.txt 

看来,当我尝试变量$网址后,来连接另一件事变量的某些部分被删除或覆盖到输出文件

例如,如果我试图用这个

printf '%s %s\n' "$url" "pp" >> test.txt 

我得到一个简单的猫的test.txt是这样的:

pptest.it 

但变量$ URL的内容必须是ABCTest.it

这是非常奇怪的

+0

输出是什么,你期望什么? – SMA 2015-04-01 15:01:41

+4

这段代码在这里工作得很好(没有输出文件)。那*确切*片断为您失败?你是否可能从原始脚本中的DOS-newline文件中读取该输入? – 2015-04-01 15:02:07

+0

是的我正在阅读csv格式的文件内容,并且我把它的所有内容放在一个简单的content =“$(cat file.csv)”变量中。这是问题吗? – GabryRome 2015-04-01 15:24:30

回答

4

为了补充chepner's helpful answer

  • 如果输出不你希望它看起来像什么,它总是值得检查它的内容,寻找隐藏控制字符可输出更改数据的外观

  • \r,一个CR(回车; ASCII值13)有两个原因臭名昭著例如:

    • (如@chepner已说明)它的光标移动到线中期的开始字符串,至少有效地擦除了它之前的部分内容;例如: -
      • echo $'abcd\refg'打印efgd:在\r引起的一切后,从字符串\r幸存之前重新启动在该行的开头打印,只有d,因为它正好是 1字符。比之后出现的字符串长。
        (注:$'...'语法是一个所谓的ANSI C-quoted string,它允许使用的转义序列的如在$'...\r...'\r创建实际控制字符。)
    • 文件与意想不到\r字符。当与Windows世界接口时经常发生,其中换行不仅仅是\n字符,而是\r\n序列,并且这些文件在Unix世界中表现得很奇怪。
  • 简单的方法来检查数据是管它cat -et,其中突出的控制字符为^<char>序列:
    • ^M表示\r(CR)
    • ^I表示\t(标签char)
    • ^[代表一个ESC字符。
    • ... # see 'man cat'
    • 的线的端部表示为$
    • 因此,利用Windows样式的行结尾一个文件将显示^M$在行输出由cat -et结束。
  • cat -et应用到上面的例子可以得到以下,这可以很容易地诊断问题:
    • echo $'abcd\refg' | cat -et # -> 'abcd^Mefg$' - note the ^M
  • dos2unix是去到工具转换的Windows风格(\r\n)到Unix的(\r\n,但这个工具并没有预装在大多数类Unix平台上,它的易于使用sta ndard POSIX公用事业执行这样的转换:
    • awk 'sub("\r$", "")+1' win.txt > unix.txt
    • 注意这个POSIX兼容的命令不允许你以替换文件就地,但是:
      • 如果您有GNUsed,下面将到位执行转换
        • sed -i 's/\r$//' winIn_UnixOut.txt
      • 同上与BSDsed(也用在OSX),从bashksh,或zsh
        • sed -i '' $'s/\r$//' winIn_UnixOut.txt
0

试试这个:

echo -ne "\n""$url"",$name" >> "$outputDir/$fileName" 
+0

不起作用:-( – GabryRome 2015-04-01 15:14:37

+0

你使用的是什么shell/OS?什么是所需的输出和什么是你的输出? – mrh 2015-04-01 15:21:11

+0

bash/OS XY osemite ver。 10.10.2 我的输入是一个csv文件,内容类似于: abc test; ABCtest.it abc test2; ABCtest2。com xyz test3; XYZtest3.org 等 – GabryRome 2015-04-01 15:29:17

1

不知何故,中$string值以回车结束。什么你实际上是呼应是

echo -ne "\nABCtest.it\r,abc test" 

这回车使光标打印它后面,覆盖URL文本之前移动到当前行的开头。无论是删除与

string=${string#?} 

回车或修复string是如何在第一位置设置(我怀疑你是从使用DOS行结束一个文件,在这种情况下,你可以将文件转换与dos2unix阅读。)