Shell脚本奇怪的回声行为

Gab*_*ome 5 bash echo

我想以这种方式打印我从Array拆分中获得的内容:

string="abc test;ABCtest.it"

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

echo -ne "\n$url,$name" >> "$outputDir/$fileName"
Run Code Online (Sandbox Code Playgroud)

但输出文件不包含url部分

我认为问题是"." 但我不知道如何解决它

如果我试试这个

echo $url
Run Code Online (Sandbox Code Playgroud)

这是工作!

谢谢


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

printf '%s %s\n' "$url" "$name"  >> test.txt
Run Code Online (Sandbox Code Playgroud)

似乎当我尝试在变量$ url之后连接另一个东西时,变量的某些部分被删除或覆盖到输出文件中

例如,如果我尝试这个

printf '%s %s\n' "$url" "pp"  >> test.txt
Run Code Online (Sandbox Code Playgroud)

我用简单的cat test.txt得到的是:

 pptest.it
Run Code Online (Sandbox Code Playgroud)

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

这很奇怪

mkl*_*nt0 5

补充chepner的有用答案:

  • 如果输出不你希望它是什么样子,它总是值得研究的内容,寻找隐藏的控制字符可能会改变数据的外观上输出.

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

    • (正如@chepner所说)它将光标移动到中间字符串的开头,有效地删除了之前的部分内容; 例如:
      • echo $'abcd\refg'打印efgd:\r导致所有内容在行开始时重新开始打印,只有幸存之前d字符串,因为它恰好是 1个字符.比来弦长之后. (注意:语法是所谓的ANSI C引用字符串,它允许使用转义序列,例如in 来创建实际的控制字符.)\r
        $'...'\r$'...\r...'
    • 带有意外\r字符的文件.当与Windows世界接口时经常发生,其中换行符不仅仅是\n字符串,而是\r\n序列,而且这些文件在Unix世界中表现得很奇怪.
  • 检查数据的cat -et一种简单方法是将数据管道化,将控件字符突出显示为^<char>序列:
    • ^M代表一个\r(CR)
    • ^I代表一个\t(tab.cos)
    • ^[ 代表ESC char.
    • ... # 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平台上,并且很容易使用标准的POSIX实用程序来执行这样的转换:
    • awk 'sub("\r$", "")+1' win.txt > unix.txt
    • 请注意,此POSIX兼容命令不允许您就地替换文件,但是:
      • 如果你有GNU sed,下面将进行转换到位:
        • sed -i 's/\r$//' winIn_UnixOut.txt
      • 同上用BSD sed(也用在OSX),从bash,kshzsh:
        • sed -i '' $'s/\r$//' winIn_UnixOut.txt