0

I'm trying to run a shell script that counts the number of rows in each file, and if the number < 2 I need to move it to a different directory.

shell:

#!/bin/bash
foreach i in (ls *.DAT)
 a=`wc -l $i`
 if $a=<2 then
 mv $i aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup 
 endif
end

But my shell gets an error:

igud_to_backup.sh: line 8: syntax error near unexpected token `('

igud_to_backup.sh: line 8: `foreach i in (ls *.DAT)'

What is wrong with the shell script?

2
  • see also List (or move) only files with a certain number of lines? Commented Jun 28, 2016 at 10:58
  • Is that a csh or tcsh shell script? (I'm unfamiliar with them but) If it is, the #!-line is wrong and should point to the csh executable instead. Commented Jun 28, 2016 at 11:46

2 Answers 2

2

There are many problems:

  • foreach is not a bash keyword: use for
  • if you want to execute a command use $( ... ) and not just the parenthesis
  • the command execution in the parenthesis is not needed you can just use shell expansion for i in *.DAT; do (in general see Why *not* parse `ls`?)
  • to test if a value is less or equal (see man test): if [ $a -le 2 ] ; then
  • a for is ended by done and not end
  • an if is ended by fi and not endif
  • if you give the file name as an argument to wc it will print the number of lines and the file name. Use < to make wc read from standard input

To sum up:

#!/bin/sh
for i in *DAT; do
 a=$( wc -l < "$i" )
 if [ "$a" -le 2 ] ; then
 mv "$i" aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
 fi
done
answered Jun 28, 2016 at 10:51
6
  • Hey, thanks a lot, now it is much better. but still getting error: unknown operator Commented Jun 28, 2016 at 10:59
  • @don_crissti Oops sorry Commented Jun 28, 2016 at 11:06
  • @Elislu What do you mean? Commented Jun 29, 2016 at 10:13
  • Hey, The Shell: #!/bin/sh for i in $(ls *.DAT); do if [ "$a" -ge 2 ] ; then mv ${i} /aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup fi done He should count how many rows there are in each file and then with two or more rows, he should move it to another directory. But unfortunately it does not work :( Commented Jun 29, 2016 at 10:19
  • The code you posted in the last comment is not what I suggested. But more importantly you are missing the line assigning the number of rows to a ` a=$( wc -l < "$i" )` Commented Jun 29, 2016 at 10:20
0

As Matteo mentioned you are trying to use perl syntax. Should be;

for i in $(ls *.DAT); do
 if [ $(wc -l ${i}) -le 2 ]; then
 mv ${i} /path/to/
 fi
done
answered Jun 28, 2016 at 11:36
1
  • Looks more like csh syntax to me, but anyway, it isn't bash. Commented Jun 28, 2016 at 11:45

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.