Saltar al contenido

Pasar parámetros a una función Bash

octubre 19, 2021
apple touch icon@2

El conocimiento de lenguajes de programación de alto nivel (C / C ++, Java, PHP, Python, Perl, etc.) sugeriría al profano que las funciones de Bourne Again Shell (Bash) deberían funcionar como lo hacen en esos otros lenguajes.

En lugar de, Las funciones de Bash funcionan como comandos de shell y esperan que se les pasen argumentos de la misma manera que uno podría pasar una opción a un comando de shell (por ejemplo, ls -l). En efecto, argumentos de la función en Bash se tratan como parámetros posicionales ($1, $2..$9, ${10}, ${11}, etcétera). Esto no es ninguna sorpresa considerando cómo getopts obras. No use paréntesis para llamar a una función en Bash.


(Nota: Resulta que estoy trabajando en OpenSolaris en este momento.)

# Bash style declaration for all you PHP/JavaScript junkies. :-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
function backupWebRoot ()
{
    tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
        echo -e "nTarball created!n"
}


# sh style declaration for the purist in you. ;-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
backupWebRoot ()
{
    tar -cvf - "$1" | zip -n .jpg:.gif:.png "$2" - 2>> $errorlog &&
        echo -e "nTarball created!n"
}


# In the actual shell script
# $0               $1            $2

backupWebRoot ~/public/www/ webSite.tar.zip

¿Quiere usar nombres para las variables? Solo haz algo así.

local filename=$1 # The keyword declare can be used, but local is semantically more specific.

Pero ten cuidado. Si un argumento de una función tiene un espacio, es posible que desee hacer esto en su lugar. De lo contrario, $1 puede que no sea lo que crees que es.

local filename="$1" # Just to be on the safe side. Although, if $1 was an integer, then what? Is that even possible? Humm.

¿Quiere pasar una matriz a una función por valor?

callingSomeFunction "${someArray[@]}" # Expands to all array elements.

Dentro de la función, maneje los argumentos de esta manera.

function callingSomeFunction ()
{
    for value in "[email protected]" # You want to use "[email protected]" here, not "$*" !!!!!
    do
        :
    done
}

¿Necesita pasar un valor y una matriz, pero aún usa «$ @» dentro de la función?

function linearSearch ()
{
    local myVar="$1"

    shift 1 # Removes $1 from the parameter list

    for value in "[email protected]" # Represents the remaining parameters.
    do
        if [[ $value == $myVar ]]
        then
            echo -e "Found it!t... after a while."
            return 0
        fi
    done

    return 1
}

linearSearch $someStringValue "${someArray[@]}"

En Bash 4.3 y superior, puede pasar una matriz a una función por referencia definiendo el parámetro de una función con el -n opción.

function callingSomeFunction ()
{
    local -n someArray=$1 # also ${1:?} to make the parameter mandatory.

    for value in "${someArray[@]}" # Nice!
    do
        :
    done
}

callingSomeFunction someArray # No $ in front of the argument. You pass by name, not expansion / value.
close