I am new at shell script programming and I'm trying to execute a software that reads a text and perform it's POS tagging. It requires an input and an output, as can be seen in the execute example:

$ cat input.txt | /path/to/tagger/run-Tagger.sh > output.txt

What I'm trying to do is to execute this line not only for a text, but a set of texts in an specific folder, and return the output files with the same name as the input files. So, I tried to do this script:


for arqin in '/home/rafaeldaddio/Documents/teste/*'
out=$(basename $arqin)
cat $arqin | $program > $output

I tried it with only one file and it works, but when I try with more than one, I get this error:

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

Any insights on what I'm doing wrong? Thanks.

2 Answers 2


You've put single quotes around '/home/rafaeldaddio/Documents/teste/*'. This means that it is looking for a single file called * inside teste. (I doubt you have such a file, or that that's what you intended!).

This means your for loop is running with a single entry, and passing that file * to basename.

Then, out=$(basename $arqin) is expanding to out=$(basename file1 file2 file3 ... fileN) which of course is too many arguments for basename.

Simple solution: take the quotes away from around /home/rafaeldaddio/Documents/teste/*.


@BenXO already told you why that failed but you don't really need a script for something this simple anyway. You could just paste this directly into the command line:

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"); 

Or, since if cat foo | program works, program foo almost certainly also works and assuming that /home/rafaeldaddio/ is your home directory, you can simplify to:

for arqin in ~/Documents/teste/*; do
 ~/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh "$arqin" > \
     ~/Documents/$(basename "$arqin");

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .