bash problem with if


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting bash problem with if
# 1  
Old 06-19-2010
bash problem with if

Code:
#!/bin/bash

#  This script takes two arguments: <path> and <dir>. It has to copy in <dir>
#+ all regular files in <path> with .c extension containining at least one while
#+ instruction and one if instruction.

if [ "$#" -eq 2 -a -d "$2" ]
then
    for file in $(ls "$1" | grep "\.c$")
    do
      if [ -f "$file" ]  # doesn't work
      then
          a=$(strings "$1"/"$file" | grep -c while)
          b=$(strings -n2 "$1"/"$file" | grep -c if)

          if [ "$a" -gt 1 -a "$b" -gt 1 ] # doesn't work
          then
              cp "$1"/"$file" "$2"
          fi
      fi
    done

    exit 0
else
    echo "script use: `basename $0` <path> <dir>"

    exit 1
fi

I don't understand why those conditions don't work, especially that -f "$file".

Last edited by Luke Bonham; 06-19-2010 at 06:34 AM..
# 2  
Old 06-19-2010
Hi
Provide some more info, on how are you trying to run it. The script is taking a couple of arguments and it depends on quite a few things. The second argument should be directory, the first one should either be a .c file OR a directory containing .c files.

Guru.
# 3  
Old 06-19-2010
As I wrote in the code first comment, this script must take two arguments, a pathname <path> and a directory <dir>, then it has to select every regular file with .c extension in <path> and to copy it in <dir>. You have understood correctly.

Here's the files I use:

Code:
luke@luke-desktop:~/Desktop/TEST$ ls
folder1 folder2
luke@luke-desktop:~/Desktop/TEST$ cd folder1
luke@luke-desktop:~/Desktop/TEST/folder1$ cat hello1.c
while
while
if
luke@luke-desktop:~/Desktop/TEST/folder1$ cat hello2.c
luke@luke-desktop:~/Desktop/TEST/folder1$

Here's the code when I run it, using ./folder1/ as <path> and ./folder2/ as <dir>:

Code:
luke@luke-desktop:~/Desktop/TEST$ bash -x es3 ./folder1/  ./folder2/
 + '[' 2 -eq 2 -a -d ./folder2/ ']'
 ++ grep '\.c$'
 ++ ls ./folder1/
 + for file in '$(ls "$1" | grep "\.c$")'
 + '[' -f hello1.c ']'
 + for file in '$(ls "$1" | grep "\.c$")'
 + '[' -f hello2.c ']'
 + exit 0

It is clear that

Code:
if [ -f "$file" ]

is always false, and if I comment it, then

Code:
if [ "$a" -gt 1 -a "$b" -gt 1 ]

is always false.

And I don't understand why, maybe some syntax errors?
# 4  
Old 06-19-2010
Hi

When the file is being checked using the below:
Code:
 if [ -f "$file" ]

the script is still in the directory ~/Desktop/TEST . And hence it checks for the file hello.c in this directory and fails. Either change the directory before 'if' to ~/Desktop/TEST/folder1 or use the absolute path to check.

Guru.
This User Gave Thanks to guruprasadpr For This Post:
# 5  
Old 06-19-2010
Try leaving out ls :
Code:
#!/bin/bash

#  This script takes two arguments: <path> and <dir>. It has to copy in <dir>
#+ all regular files in <path> with .c extension containining at least one while
#+ instruction and one if instruction.

if [ "$#" -eq 2 -a -d "$2" ]
then
    for file in "$1"/*.c
    do
      if [ -f "$file" ]  # doesn't work
      then
          a=$(strings "$file" | grep -c while)
          b=$(strings -n2 "$file" | grep -c if)

          if [ "$a" -gt 1 -a "$b" -gt 1 ] # doesn't work
          then
              cp "$file" "$2"
          fi
      fi
    done

    exit 0
else
    echo "script use: `basename $0` <path> <dir>"

    exit 1
fi

This User Gave Thanks to Scrutinizer For This Post:
# 6  
Old 06-20-2010
Quote:
Originally Posted by Scrutinizer
Code:
 for file in "$1"/*.c

Really cool man!

So using a for argument like this not only list $1 files, but also moves the control in $1 directory, and could be specified which file type must be selected.

Some questions about this method:

  1. Is there a way to list $1 files recursively ?
  2. Could more file types be specified after"/" ?
  3. Are there any other options besides "/" ?
Or better still, could you tell me everything you know about, please? :-D
# 7  
Old 06-20-2010
Hi Luke,

It does not actually "moves the control" but rather just keeps the path attached to the file name. Just run this on the command line and see what the output looks like:
Code:
for i in ./folder1/*.c; do echo $i; done

1. Not like this. You could do this:
Code:
for file in "$1"/*.c "$1"/*/*.c
do

Which would list any .c file in the directory an one level lower.
Otherwise you would have to do something like this:
Code:
find "$1" -name '*.c' | 
while read file
do

2. Sure you can do, this for example:
Code:
for file in "$1"/*.[ch]
do

to list all *.c and *.h files

3. I do not know what you mean with "option"

S.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

A bash problem

Hi, I'm fairly new to unix, and I have the following problem: I know that if I type, "ps -ef | grep process", this will return some information about the process named 'process'. What I need this to do is be piped to an extra search that pick's out process' PID. How do I do this? Thanks in... (5 Replies)
Discussion started by: bogof_tom
5 Replies

2. Shell Programming and Scripting

Problem With Bash Scripting

What's up guys, I am currently trying to figure out the answer to this question and I cannot for the life of me! The question is : "Explain how to do the following in UNIX/Linux shell script. You are not expected to remember the exact command syntax, but explain approximately how you would... (1 Reply)
Discussion started by: malikirl
1 Replies

3. Shell Programming and Scripting

zero padding problem (bash)

Hi there, I need to loop some values, for i in $(seq $first $last) do does something here donefor $first and $last, i need it to be of fixed length 5. so if the input is 1, i need to add zeros in front such that it becomes 00001. It loops till 99999 for example, but the length has to be... (4 Replies)
Discussion started by: jremio
4 Replies

4. Shell Programming and Scripting

Problem with bash if

Hi, i am making a little script that when its invoked with p or f, it will do different things (p will ask the user to input an string and it will count its words , and f will ask the user a directory and will list the number of files in that directory. But if wont get the comparation string... (1 Reply)
Discussion started by: lamachejo
1 Replies

5. Solaris

bash problem?

I am using SunOS 5.9 and have the following outcome when using the sh and bash shells; has anyone else had this: (tests behave differently) bash-2.05$ ksh $ if echo $SHELL; uname -a;; then echo yessssssssssssss; else echo nooooooooooooooo; fi SunOS s036cln001014 5.9 Generic_118558-27 sun4u... (4 Replies)
Discussion started by: Cliffcard
4 Replies

6. Shell Programming and Scripting

bash problem

hello i am new with linux hello unix forum. i have big problem i want to install the samp server for every user folder for ex.. samp for my frined name fred fredsamp then i want create more samp to my firend lee i want folder name will be leesamp i want to know how make the script put the... (0 Replies)
Discussion started by: mage200
0 Replies

7. Shell Programming and Scripting

bash problem

I have a ksh script with the following code and working fine under ksh. IFS=$IFS IFS=: while read a b c do test "$a" = "$oraserver" && { orahome=$b; break; } echo $orahome done < /var/opt/oracle/oratab2 IFS=$_IFS ... (13 Replies)
Discussion started by: talashil
13 Replies

8. Shell Programming and Scripting

problem about '..' in bash

There is an interview question about UNIX bash: Some shells like bash try to make '..' always work propery, namely, from home directory, cd ../$USER will place you in your home directory. Does bash always get this behavior correct? Anyway can provide any example that bash doesnt work well? ... (4 Replies)
Discussion started by: usfish
4 Replies

9. Shell Programming and Scripting

Bash problem

Hello there, I'm a beginner in bash programining and I have a problem with the interpretetion of the code: sed -e "s/\(*\):.*/\1/" in this for loop: for process in $(sed -e "s/\(*\):.*/\1/" /etc/passwd) thx for any help edgehead (3 Replies)
Discussion started by: edgehead
3 Replies

10. Shell Programming and Scripting

Bash while loop problem

Hi, I'm having a problem with the while loop in bash. I try the following script: #!/bin/bash while true do echo "test" done When I try this, it gives me this error: while: Too few arguments. What am I doing wrong? Thanks (5 Replies)
Discussion started by: Kweekwom
5 Replies
Login or Register to Ask a Question