Re: [問題] batch to shell script

作者: goldie (阿良)   2013-07-03 22:50:43
※ 引述《psylove5566 (甜小蜜)》之銘言:
: Hi,
: 請教一下各位大大
: 我有一個batch file如下:
: FOR /F %%i in (list1.txt) DO (parser21 < OriginalData_new/%%i > ParserOut_ver/%%i )
: 我想轉換為shell檔,我試著轉換,以下是經過網路上查後,我轉換後的檔案,但因為還是無法執行,想請教一下錯誤何在?
: for i in [list1.txt]; do "parser21 < OriginalData_new/i > ParserOut_ver/i "
我猜你是要把 list1.txt 裡的內容,一次取一行出來對吧?
在 bash 裡,
用 while + read 兩個指令搭配,以達到切一行一行出來,
對於讀檔來說,我覺得比 for 好用。
例如: (假設 parser21 OriginalData_new/ ParserOut_ver/ 都在當前目錄)
作者: psylove5566 (甜小蜜)   2013-07-04 10:17:00
恩,我是要讀list中的每一個檔案,謝謝您的回覆
作者: goldie (阿良)   2013-07-04 21:59:00
-d設定分隔字元, 本次採unix換行字元: $'\n'格式一定要錢號加一對單引號,不能少$,也不能換成雙引號這是 bash 特殊語法,用於展開跳脫字元
作者: psylove5566 (甜小蜜)   2013-07-05 16:15:00
不好意思,我執行後出現以下的錯誤syntax error near unexpected token `<'請問,done表示while結束,為啥輸入list在done之後?請問兩個<分開打的意思是什麼,謝謝您的回覆
作者: goldie (阿良)   2013-07-05 22:20:00
()是subshell而<()多把subshell的stdout導出偽裝成檔案再用第一個<設定while-loop的stdin來自上述的(偽)檔案< <() 等效於 < input_text_file所以兩個< <不能連在一起,因為是不同功能用途XDDD當然你可以把這個while-loop重寫成 pipe 型式… 例如:cat list1.txt | while read -r -d $'\n' line; do (…略)雖然改成這樣好像比較直觀,但我覺得有時反而難用,因為…原本是cat跑在subshell裡,新的反而是pipe後面的while-loop跑在subshell裡,這樣我常在while-loop設定全域變數,會在script其他處取用不到(parent shell)會造成有些你想做的事情你達不到關於<()跟>()語法,有個名詞叫 "process substitution"可參考這篇: http://goo.gl/5jBpn以及 Google Shell Style Guide:http://goo.gl/0WN2r 的 Features & Bugs: Pipes to While若兩個<少隔空白而連在一起成<<則變成here document種語法
作者: psylove5566 (甜小蜜)   2013-07-07 10:04:00
謝謝您詳細的介紹,非常的感激

Links booklink

Contact Us: admin [ a t ] ucptt.com