![Проблемы с базовым именем в цикле](https://rvso.com/image/38675/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B%20%D1%81%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%BC%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BC%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5.png)
Я новичок в программировании скриптов оболочки и пытаюсь выполнить программное обеспечение, которое считывает текст и выполняет его 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