매개 변수를 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 입니다.
'programing' 카테고리의 다른 글
바인딩 항목WPF 데이터 그리드의 ComboBox 열 원본 (0) | 2023.05.05 |
---|---|
DateTime 속성의 기본값을 DateTime으로 설정하는 중입니다.이제 시스템 안으로 들어갑니다.ComponentModel 기본값 특성입니다. (0) | 2023.04.25 |
여러 조건이 있는 Bash if 문이 오류를 발생시킵니다. (0) | 2023.04.25 |
모든 Excel 시트 끝에 명명된 시트를 추가하는 방법은 무엇입니까? (0) | 2023.04.25 |
Angular 자습서에서 파이프 및 탭 방법이란 무엇입니까? (0) | 2023.04.25 |