Returning value from called function in a shell script

后端 未结 5 503
自闭症患者
自闭症患者 2020-11-27 08:55

I want to return the value from a function called in a shell script. Perhaps I am missing the syntax. I tried using the global variables. But that is also not working. The c

相关标签:
5条回答
  • 2020-11-27 09:33

    I think returning 0 for succ/1 for fail (glenn jackman) and olibre's clear and explanatory answer says it all; just to mention a kind of "combo" approach for cases where results are not binary and you'd prefer to set a variable rather than "echoing out" a result (for instance if your function is ALSO suppose to echo something, this approach will not work). What then? (below is Bourne Shell)

    # Syntax _w (wrapReturn)
    # arg1 : method to wrap
    # arg2 : variable to set
    _w(){
    eval $1
    read $2 <<EOF
    $?
    EOF
    eval $2=\$$2
    }
    

    as in (yep, the example is somewhat silly, it's just an.. example)

    getDay(){
      d=`date '+%d'`
      [ $d -gt 255 ] && echo "Oh no a return value is 0-255!" && BAIL=0 # this will of course never happen, it's just to clarify the nature of returns
      return $d
    }
    
    dayzToSalary(){
      daysLeft=0
      if [ $1 -lt 26 ]; then 
          daysLeft=`expr 25 - $1`
      else
         lastDayInMonth=`date -d "`date +%Y%m01` +1 month -1 day" +%d`
         rest=`expr $lastDayInMonth - 25`
         daysLeft=`expr 25 + $rest`
      fi
      echo "Mate, it's another $daysLeft days.."
    }
    
    # main
    _w getDay DAY # call getDay, save the result in the DAY variable
    dayzToSalary $DAY
    
    0 讨论(0)
  • 2020-11-27 09:33

    In case you have some parameters to pass to a function and want a value in return. Here I am passing "12345" as an argument to a function and after processing returning variable XYZ which will be assigned to VALUE

    #!/bin/bash
    getValue()
    {
        ABC=$1
        XYZ="something"$ABC
        echo $XYZ
    }
    
    
    VALUE=$( getValue "12345" )
    echo $VALUE
    

    Output:

    something12345
    
    0 讨论(0)
  • 2020-11-27 09:37

    A Bash function can't return a string directly like you want it to. You can do three things:

    1. Echo a string
    2. Return an exit status, which is a number, not a string
    3. Share a variable

    This is also true for some other shells.

    Here's how to do each of those options:

    1. Echo strings

    lockdir="somedir"
    testlock(){
        retval=""
        if mkdir "$lockdir"
        then # Directory did not exist, but it was created successfully
             echo >&2 "successfully acquired lock: $lockdir"
             retval="true"
        else
             echo >&2 "cannot acquire lock, giving up on $lockdir"
             retval="false"
        fi
        echo "$retval"
    }
    
    retval=$( testlock )
    if [ "$retval" == "true" ]
    then
         echo "directory not created"
    else
         echo "directory already created"
    fi
    

    2. Return exit status

    lockdir="somedir"
    testlock(){
        if mkdir "$lockdir"
        then # Directory did not exist, but was created successfully
             echo >&2 "successfully acquired lock: $lockdir"
             retval=0
        else
             echo >&2 "cannot acquire lock, giving up on $lockdir"
             retval=1
        fi
        return "$retval"
    }
    
    testlock
    retval=$?
    if [ "$retval" == 0 ]
    then
         echo "directory not created"
    else
         echo "directory already created"
    fi
    

    3. Share variable

    lockdir="somedir"
    retval=-1
    testlock(){
        if mkdir "$lockdir"
        then # Directory did not exist, but it was created successfully
             echo >&2 "successfully acquired lock: $lockdir"
             retval=0
        else
             echo >&2 "cannot acquire lock, giving up on $lockdir"
             retval=1
        fi
    }
    
    testlock
    if [ "$retval" == 0 ]
    then
         echo "directory not created"
    else
         echo "directory already created"
    fi
    
    0 讨论(0)
  • 2020-11-27 09:50

    You are working way too hard. Your entire script should be:

    if mkdir "$lockdir" 2> /dev/null; then 
      echo lock acquired
    else
      echo could not acquire lock >&2
    fi
    

    but even that is probably too verbose. I would code it:

    mkdir "$lockdir" || exit 1
    

    but the resulting error message is a bit obscure.

    0 讨论(0)
  • 2020-11-27 09:52

    If it's just a true/false test, have your function return 0 for success, and return 1 for failure. The test would then be:

    if function_name; then
      do something
    else
      error condition
    fi
    
    0 讨论(0)
提交回复
热议问题