Re: [問題] batch to shell script

看板LinuxDev作者 (阿良)時間10年前 (2013/07/03 22:50), 編輯推噓3(3022)
留言25則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

07/04 10:17, , 1F
恩,我是要讀list中的每一個檔案,謝謝您的回覆
07/04 10:17, 1F

07/04 21:59, , 2F
-d設定分隔字元, 本次採unix換行字元: $'\n'
07/04 21:59, 2F

07/04 22:00, , 3F
格式一定要錢號加一對單引號,不能少$,也不能換成雙引號
07/04 22:00, 3F

07/04 22:01, , 4F
這是 bash 特殊語法,用於展開跳脫字元
07/04 22:01, 4F

07/05 16:15, , 5F
不好意思,我執行後出現以下的錯誤
07/05 16:15, 5F

07/05 16:16, , 6F
syntax error near unexpected token `<'
07/05 16:16, 6F

07/05 16:18, , 7F
請問,done表示while結束,為啥輸入list在done之後?
07/05 16:18, 7F

07/05 16:19, , 8F
請問兩個<分開打的意思是什麼,謝謝您的回覆
07/05 16:19, 8F

07/05 22:20, , 9F
()是subshell而<()多把subshell的stdout導出偽裝成檔案
07/05 22:20, 9F

07/05 22:21, , 10F
再用第一個<設定while-loop的stdin來自上述的(偽)檔案
07/05 22:21, 10F

07/05 22:23, , 11F
< <() 等效於 < input_text_file
07/05 22:23, 11F

07/05 22:25, , 12F
所以兩個< <不能連在一起,因為是不同功能用途XDDD
07/05 22:25, 12F

07/05 22:25, , 13F
當然你可以把這個while-loop重寫成 pipe 型式… 例如:
07/05 22:25, 13F

07/05 22:26, , 14F
cat list1.txt | while read -r -d $'\n' line; do (…略)
07/05 22:26, 14F

07/05 22:27, , 15F
雖然改成這樣好像比較直觀,但我覺得有時反而難用,因為…
07/05 22:27, 15F

07/05 22:31, , 16F
原本是cat跑在subshell裡,新的反而是pipe後面的while-loop
07/05 22:31, 16F

07/05 22:32, , 17F
跑在subshell裡,這樣我常在while-loop設定全域變數,會在
07/05 22:32, 17F

07/05 22:33, , 18F
script其他處取用不到(parent shell)會造成有些你想做的事
07/05 22:33, 18F

07/05 22:33, , 19F
情你達不到
07/05 22:33, 19F

07/05 22:36, , 20F
關於<()跟>()語法,有個名詞叫 "process substitution"
07/05 22:36, 20F

07/05 22:37, , 21F
可參考這篇: http://goo.gl/5jBpn
07/05 22:37, 21F

07/06 14:54, , 22F
以及 Google Shell Style Guide:
07/06 14:54, 22F

07/06 14:54, , 23F
http://goo.gl/0WN2r 的 Features & Bugs: Pipes to While
07/06 14:54, 23F

07/06 22:27, , 24F
若兩個<少隔空白而連在一起成<<則變成here document種語法
07/06 22:27, 24F

07/07 10:04, , 25F
謝謝您詳細的介紹,非常的感激
07/07 10:04, 25F
文章代碼(AID): #1Hr3f6BM (LinuxDev)
文章代碼(AID): #1Hr3f6BM (LinuxDev)