views:

31

answers:

4

Example:

#!/bin/sh

a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}

r=`a`
echo $r

$r contains "t" or "f" but also the output of the "ls" command.

I may write ls -1 a* >/dev/null 2>/dev/null, but if there is a more complex script that can be lead to errors.

Is there any way to return a single value from a() ?

A: 
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

Consider using [ -f filename ] and other file tests as well.

jim mcnamara
A: 

you don't have to use ls to check for files starting with a. Just use the shell

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}
ghostdog74
This is an example, not my question. How can i avoid to write everywhere ">/dev/null 2>/dev/null" when i want to have a single value/string from a script function.
PeterMmm
A: 
Gilles
A: 

A shell function can return a numeric value. Consider 0 and 1 rather than 'f' and 't'

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

This will still write output from the ls -1 a* which you probably still want to dispose of, but the value of r will be either 0 or 1 and won't include the output.

The other examples of redirecting output either from a line or a whole block are good, and, as others suggested, you should get to know other ways to test for conditions (but I was assuming the ls was kind of an arbitrary example)

Stephen P