programing

매개 변수를 Bash 함수에 전달합니다.

telecom 2023. 4. 25. 21:53
반응형

매개 변수를 Bash 함수에 전달합니다.

Bash 함수에서 매개 변수를 전달하는 방법을 검색하려고 하지만 항상 명령줄에서 매개 변수를 전달하는 방법이 표시됩니다.

스크립트 내에서 매개 변수를 전달하고 싶습니다.노력했습니다.

myBackupFunction("..", "...", "xx")

function myBackupFunction($directory, $options, $rootPassword) {
     ...
}

하지만 구문이 올바르지 않습니다.내 함수에 매개 변수를 전달하려면 어떻게 해야 합니까?

함수를 선언하는 일반적인 방법은 두 가지가 있습니다.저는 두 번째 방법이 더 좋아요.

function function_name {
   command...
} 

아니면요?

function_name () {
   command...
} 

인수를 사용하여 함수를 호출하려면 다음과 같이 하십시오.

function_name "$arg1" "$arg2"

함수는 이름이 아닌 위치에 의해 전달된 인수를 참조합니다.$1,$2, 등이 스크립트 자체의 이름입니다.

예를 들어 다음과 같습니다.

function_name () {
   echo "Parameter #1 is $1"
}

또한 직무가 선언된 후에는 직무에 호출해야 합니다.

#!/usr/bin/env sh

foo 1  # this will fail because foo has not been declared yet.

foo() {
    echo "Parameter #1 is $1"
}

foo 2 # this will work.

출력은 다음과 같습니다.

./myScript.sh: line 2: foo: command not found
Parameter #1 is 2

참조: 고급 Bash-Scripting Guide를 참조하십시오.

고급 프로그래밍 언어(C/C++, Java, PHP, Python, Perl 등)에 대한 지식은 일반인들에게 Bourne Again Shell(Bash) 함수가 다른 언어에서처럼 작동해야 한다고 제안합니다.

대신 Bash 함수는 셸 명령처럼 작동하며 셸 명령에 옵션을 전달할 수 있는 것과 동일한 방식으로 인수를 전달합니다(예:ls -l실제로 Bash의 함수 인수는 위치 매개 변수로 처리됩니다( ).$1, $2..$9, ${10}, ${11}, 등)을 클릭합니다.이 일을 생각하면 놀랄 일도 아니다getopts동작합니다. Bash에서 함수를 호출할 때 괄호를 사용하지 마십시오.


(참고: 저는 현재 OpenSolaris 작업을 하고 있습니다.)

# 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

변수에 이름을 사용하시겠습니까?어떻게 좀 해봐요.

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

하지만 조심하세요.함수에 대한 인수에 공백이 있으면 대신 이 작업을 수행할 수 있습니다!그렇지않으면,$1당신이 생각하는 그런 게 아닐 수도 있어요

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

값으로 함수에 어레이를 전달하시겠습니까?

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

함수 내에서 인수를 다음과 같이 처리합니다.

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

값과 어레이를 전달해야 하지만 함수 내부에 "$@"를 사용해야 합니까?

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

    shift 1 # Removes $1 from the parameter list

    for value in "$@" # 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[@]}"

Bash 4.3 이상에서는 다음을 사용하여 함수의 매개 변수를 정의하여 참조를 통해 배열을 함수에 전달할 수 있습니다.-n선택.

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

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

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

명명된 매개 변수를 선호하는 경우 명명된 매개 변수를 실제로 함수에 전달할 수 있습니다(배열 및 참조를 전달할 수도 있음).

제가 개발한 방법을 사용하면 다음과 같은 함수에 전달되는 명명된 매개 변수를 정의할 수 있습니다.

function example { args : string firstName , string lastName , integer age } {
  echo "My name is ${firstName} ${lastName} and I am ${age} years old."
}

또한 인수에 @required 또는 @readonly로 주석을 붙이고...rest 인수를 만들고 순차적 인수로 배열(예: 사용)을 만들 수 있습니다. string[4]필요한 경우 인수를 여러 줄로 나열합니다.

function example {
  args
    : @required string firstName
    : string lastName
    : integer age
    : string[] ...favoriteHobbies

  echo "My name is ${firstName} ${lastName} and I am ${age} years old."
  echo "My favorite hobbies include: ${favoriteHobbies[*]}"
}

즉, 매개 변수를 이름으로 부를 수 있을 뿐만 아니라 실제로 배열(및 변수에 대한 참조 - 이 기능은 Bash 4.3에서만 작동합니다)을 전달할 수 있습니다.또한 매핑된 변수는 모두 로컬 범위 내에 있습니다. 이는 한한매 한매 매한 as as as as as as , plus , plus , plus , plus , plus ,, , , , , , , plus plus , , , , , , , , ,$1(으)ㄹ 수 있다입니다.

이 코드를 작동시키는 코드는 매우 가볍고 Bash 3과 Bash 4에서 모두 작동합니다(이것들만이 테스트한 버전입니다).만약 당신이 bash와 함께 훨씬 더 멋지고 쉽게 개발할 수 있는 이와 같은 트릭에 관심이 있다면, 당신은 나의 Bash Infinity Framework를 볼 수 있습니다. 아래 코드는 그것의 기능 중 하나로 사용할 수 있습니다.

shopt -s expand_aliases

function assignTrap {
  local evalString
  local -i paramIndex=${__paramIndex-0}
  local initialCommand="${1-}"

  if [[ "$initialCommand" != ":" ]]
  then
    echo "trap - DEBUG; eval \"${__previousTrap}\"; unset __previousTrap; unset __paramIndex;"
    return
  fi

  while [[ "${1-}" == "," || "${1-}" == "${initialCommand}" ]] || [[ "${#@}" -gt 0 && "$paramIndex" -eq 0 ]]
  do
    shift # First colon ":" or next parameter's comma ","
    paramIndex+=1
    local -a decorators=()
    while [[ "${1-}" == "@"* ]]
    do
      decorators+=( "$1" )
      shift
    done

    local declaration=
    local wrapLeft='"'
    local wrapRight='"'
    local nextType="$1"
    local length=1

    case ${nextType} in
      string | boolean) declaration="local " ;;
      integer) declaration="local -i" ;;
      reference) declaration="local -n" ;;
      arrayDeclaration) declaration="local -a"; wrapLeft= ; wrapRight= ;;
      assocDeclaration) declaration="local -A"; wrapLeft= ; wrapRight= ;;
      "string["*"]") declaration="local -a"; length="${nextType//[a-z\[\]]}" ;;
      "integer["*"]") declaration="local -ai"; length="${nextType//[a-z\[\]]}" ;;
    esac

    if [[ "${declaration}" != "" ]]
    then
      shift
      local nextName="$1"

      for decorator in "${decorators[@]}"
      do
        case ${decorator} in
          @readonly) declaration+="r" ;;
          @required) evalString+="[[ ! -z \$${paramIndex} ]] || echo \"Parameter '$nextName' ($nextType) is marked as required by '${FUNCNAME[1]}' function.\"; " >&2 ;;
          @global) declaration+="g" ;;
        esac
      done

      local paramRange="$paramIndex"

      if [[ -z "$length" ]]
      then
        # ...rest
        paramRange="{@:$paramIndex}"
        # trim leading ...
        nextName="${nextName//\./}"
        if [[ "${#@}" -gt 1 ]]
        then
          echo "Unexpected arguments after a rest array ($nextName) in '${FUNCNAME[1]}' function." >&2
        fi
      elif [[ "$length" -gt 1 ]]
      then
        paramRange="{@:$paramIndex:$length}"
        paramIndex+=$((length - 1))
      fi

      evalString+="${declaration} ${nextName}=${wrapLeft}\$${paramRange}${wrapRight}; "

      # Continue to the next parameter:
      shift
    fi
  done
  echo "${evalString} local -i __paramIndex=${paramIndex};"
}

alias args='local __previousTrap=$(trap -p DEBUG); trap "eval \"\$(assignTrap \$BASH_COMMAND)\";" DEBUG;'

괄호 및 쉼표를 놓습니다.

 myBackupFunction ".." "..." "xx"

기능은 다음과 같습니다.

function myBackupFunction() {
    # Here $1 is the first parameter, $2 the second, etc.
}

함수를 호출하는 동안 스크립트를 실행하는 동안 또는 내부 스크립트를 모두 지우는 간단한 예제입니다.

#!/bin/bash
echo "parameterized function example"
function print_param_value(){
    value1="${1}" # $1 represent first argument
    value2="${2}" # $2 represent second argument
    echo "param 1 is  ${value1}" # As string
    echo "param 2 is ${value2}"
    sum=$(($value1+$value2)) # Process them as number
    echo "The sum of two value is ${sum}"
}
print_param_value "6" "4" # Space-separated value
# You can also pass parameters during executing the script
print_param_value "$1" "$2" # Parameter $1 and $2 during execution

# Suppose our script name is "param_example".
# Call it like this:
#
# ./param_example 5 5
#
# Now the parameters will be $1=5 and $2=5

로부터 두 개의 번호를 받아서 '이러다'라는 함수로 보냅니다.add코드의 맨 마지막 줄에 있음) 및 (코드의 마지막 줄에 있음)입니다.add잘 알겠습니다.

#!/bin/bash

read -p "Enter the first  value: " x
read -p "Enter the second value: " y

add(){
    arg1=$1 # arg1 gets to be the first  assigned argument (note there are no spaces)
      arg2=$2 # arg2 gets to be the second assigned argument (note there are no spaces)

    echo $(($arg1 + $arg2))
}

add x y # Feeding the arguments

명명된 매개 변수를 Bash에게 전달하는 또 다른 방법입니다.참조로 통과합니다.이 기능은 Bash 4.0에서 지원됩니다.

#!/bin/bash
function myBackupFunction(){ # directory options destination filename
local directory="$1" options="$2" destination="$3" filename="$4";
  echo "tar cz ${!options} ${!directory} | ssh root@backupserver \"cat > /mnt/${!destination}/${!filename}.tgz\"";
}

declare -A backup=([directory]=".." [options]="..." [destination]="backups" [filename]="backup" );

myBackupFunction backup[directory] backup[options] backup[destination] backup[filename];

Bash 4.3의 대체 구문은 nameref를 사용하는 것입니다.

nameref가 매끄럽게 폐기된다는 점에서 훨씬 편리하지만, 일부 오래된 지원 디스트로는 여전히 이전 버전을 배송하므로 아직은 추천하지 않습니다.

언급URL : https://stackoverflow.com/questions/6212219/passing-parameters-to-a-bash-function 입니다.

반응형