Проблемы с базовым именем в цикле

Проблемы с базовым именем в цикле

Я новичок в программировании скриптов оболочки и пытаюсь выполнить программное обеспечение, которое считывает текст и выполняет его 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/*'. Это означает, что он ищет один файл с именем *внутри teste. (Я сомневаюсь, что у вас есть такой файл, или что вы это имели в виду!).

Это означает, что ваш forцикл выполняется с одной записью и передает этот файл *в basename.

Затем out=$(basename $arqin)расширяется до, out=$(basename file1 file2 file3 ... fileN)что, конечно, слишком много аргументов для базового имени.

Простое решение: убрать кавычки из /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

Связанный контент