我是 shell 腳本程式設計的新手,我正在嘗試執行一個讀取文字並執行其 POS 標記的軟體。它需要一個輸入和一個輸出,如執行範例所示:
$ cat input.txt | /path/to/tagger/run-Tagger.sh > output.txt
我想做的是不僅針對文字執行此行,而且針對特定資料夾中的一組文字執行此行,並返回與輸入檔案同名的輸出檔案。所以,我嘗試編寫這個腳本:
#!/bin/bash
path="/home/rafaeldaddio/Documents/"
program="/home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh"
for arqin in '/home/rafaeldaddio/Documents/teste/*'
do
out=$(basename $arqin)
output=$path$out
cat $arqin | $program > $output
done
我只用一個文件嘗試過,它可以工作,但是當我嘗試使用多個文件時,我收到此錯誤:
basename: extra operand ‘/home/rafaeldaddio/Documents/teste/3’
Try 'basename --help' for more information.
./scriptLXTagger.sh: 12: ./scriptLXTagger.sh: cannot create /home/rafaeldaddio/Documents/: Is a directory
對我做錯了什麼有什麼見解嗎?謝謝。
答案1
你已經用單引號括起來了'/home/rafaeldaddio/Documents/teste/*'
。這意味著它正在尋找名為*
inside 的單一檔案teste
。 (我懷疑你有這樣的文件,或者這就是你想要的!)。
這意味著您的for
循環正在使用單一條目運行,並將該檔案傳遞*
給基本名稱。
然後,out=$(basename $arqin)
擴展到out=$(basename file1 file2 file3 ... fileN)
當然基名的參數太多了。
簡單的解決方案:去掉 around 的引號/home/rafaeldaddio/Documents/teste/*
。
答案2
@BenXO 已經告訴你為什麼失敗了,但你實際上並不需要一個腳本來完成這麼簡單的事情。您可以將其直接貼到命令列中:
for arqin in /home/rafaeldaddio/Documents/teste/*; do
cat "$arqin" |
/home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh > \
/home/rafaeldaddio/Documents/$(basename "$arqin");
done
或者,因為如果cat foo | program
有效,program foo
幾乎肯定也有效,並假設這/home/rafaeldaddio/
是您的主目錄,您可以將其簡化為:
for arqin in ~/Documents/teste/*; do
~/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh "$arqin" > \
~/Documents/$(basename "$arqin");
done