循環中的基本名稱問題

循環中的基本名稱問題

我是 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

相關內容