Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

This question is a sequel of sorts to my earlier question. The users on this site kindly helped me determine how to write a bash for loop that iterates over string values. For example, suppose that a loop control variable fname iterates over the strings "a.txt" "b.txt" "c.txt". I would like to echo "yes!" when fname has the value "a.txt" or "c.txt", and echo "no!" otherwise. I have tried the following bash shell script:

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
 echo $fname
 if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
 echo "yes!"
else
 echo "no!"
fi
done

I obtain the output:

a.txt

no!

b.txt

no!

c.txt

yes!

Why does the if statement apparently yield true when fname has the value "a.txt"? Have I used | incorrectly? Thanks for your time.

share|improve this question
3  
In bash, 'or' operator is '||' (C style). –  Marius Cotofana Sep 8 '12 at 20:47
3  
You can also use -o within the same [ ]. –  Thor Sep 8 '12 at 20:53
2  
@Thor I'd prefer || and separate [ ] over -o for portability simply because [ is not guaranteed to support more than 4 arguments. Of course if the target language is bash, no one should be using [ anyways because bash's [[ is superior in many ways. –  jw013 Sep 9 '12 at 0:46
    
@jw013 Thanks. Does this mean that I should be using if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]] rather than if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]? –  Andrew Sep 9 '12 at 17:14
1  
@Andrew That is correct, if as you are declaring the shebang as bash, as you are already doing. One advantage of [[ is that it doesn't do word splitting (special case) so [[ $unquoted_var = string ]] is safe. –  jw013 Sep 10 '12 at 2:06
add comment

2 Answers

up vote 9 down vote accepted

If you want to say OR use double pipe (||).

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

What you're doing is simply piping the output of the left side to the right side, in the same way any ordinary pipe works.

share|improve this answer
add comment

bash support modern bracket :

in old style bash: if [ ] || [ ] 
in new style bash: if [[ ]] or [[ ]] 

be sure option 2 is very better.You avoid from many error with option 2. OR:

in new style : if [[ statement or statement ]] 

You can read more about double bracket ( [[ ]] ) at here

share|improve this answer
    
and ?? No such thing. Besides: and is not the same as or. –  Mikel Sep 8 '12 at 23:58
    
Oh thank you, it was just a mistake, i updated it. –  Mohsen Pahlevanzadeh Sep 9 '12 at 21:46
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.