2015-04-01 66 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閱讀。)