看板 LinuxDev 關於我們 聯絡資訊
※ 引述《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/ 都在當前目錄) -------------------------------------- #!/bin/bash while read -r -d $'\n' line; do ./parser21 < "./OriginalData_new/${line}" > "./ParserOut_ver/${line}" done < <(cat list1.txt) -------------------------------------- 應該會是你要的? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.52.73
psylove5566:恩,我是要讀list中的每一個檔案,謝謝您的回覆 07/04 10:17
goldie:-d設定分隔字元, 本次採unix換行字元: $'\n' 07/04 21:59
goldie:格式一定要錢號加一對單引號,不能少$,也不能換成雙引號 07/04 22:00
goldie:這是 bash 特殊語法,用於展開跳脫字元 07/04 22:01
psylove5566:不好意思,我執行後出現以下的錯誤 07/05 16:15
psylove5566:syntax error near unexpected token `<' 07/05 16:16
psylove5566:請問,done表示while結束,為啥輸入list在done之後? 07/05 16:18
psylove5566:請問兩個<分開打的意思是什麼,謝謝您的回覆 07/05 16:19
goldie:()是subshell而<()多把subshell的stdout導出偽裝成檔案 07/05 22:20
goldie:再用第一個<設定while-loop的stdin來自上述的(偽)檔案 07/05 22:21
goldie:< <() 等效於 < input_text_file 07/05 22:23
goldie:所以兩個< <不能連在一起,因為是不同功能用途XDDD 07/05 22:25
goldie:當然你可以把這個while-loop重寫成 pipe 型式… 例如: 07/05 22:25
goldie:cat list1.txt | while read -r -d $'\n' line; do (…略) 07/05 22:26
goldie:雖然改成這樣好像比較直觀,但我覺得有時反而難用,因為… 07/05 22:27
goldie:原本是cat跑在subshell裡,新的反而是pipe後面的while-loop 07/05 22:31
goldie:跑在subshell裡,這樣我常在while-loop設定全域變數,會在 07/05 22:32
goldie:script其他處取用不到(parent shell)會造成有些你想做的事 07/05 22:33
goldie:情你達不到 07/05 22:33
goldie:關於<()跟>()語法,有個名詞叫 "process substitution" 07/05 22:36
goldie:可參考這篇: http://goo.gl/5jBpn 07/05 22:37
goldie:以及 Google Shell Style Guide: 07/06 14:54
goldie:http://goo.gl/0WN2r 的 Features & Bugs: Pipes to While 07/06 14:54
goldie:若兩個<少隔空白而連在一起成<<則變成here document種語法 07/06 22:27
psylove5566:謝謝您詳細的介紹,非常的感激 07/07 10:04