함수 내에서 발신자의 명령줄 인수에 액세스하려면 어떻게 해야 합니까?
스크립트 명령줄 인수에 액세스하는 함수를 bash에 쓰려고 하는데 함수에 대한 위치 인수로 대체되었습니다.명령줄 인수가 명시적으로 전달되지 않은 경우 함수가 해당 인수에 액세스할 수 있는 방법이 있습니까?
# Demo function
function stuff {
echo $0 $*
}
# Echo's the name of the script, but no command line arguments
stuff
# Echo's everything I want, but trying to avoid
stuff $*
C style(인수의수로는, 「C style(인수의 인수의 수)」를 합니다.$@
★★★★★★★★★★★★★★★★★」$#
.
$#
는 인수의 수를 나타냅니다.
$@
모든 인수를 제시합니다. 수 .args=("$@")
.
예를 들어 다음과 같습니다.
args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}
에서는, 「」라고 하는 점에 주의해 주세요.${args[0]}
는 스크립트의 이름이 아닌 첫 번째 인수입니다.
Bash Reference Manual을 읽었더니 이 내용은 BASH_ARGV로 캡처되어 있다고 합니다만, 「스택」에 대해서는 많은 것을 말하고 있습니다.
#!/bin/bash
shopt -s extdebug
function argv {
for a in ${BASH_ARGV[*]} ; do
echo -n "$a "
done
echo
}
function f {
echo f $1 $2 $3
echo -n f ; argv
}
function g {
echo g $1 $2 $3
echo -n g; argv
f
}
f boo bar baz
g goo gar gaz
★★★★★★★★★★★★에 보존f.sh
$ ./f.sh arg0 arg1 arg2
f boo bar baz
fbaz bar boo arg2 arg1 arg0
g goo gar gaz
ggaz gar goo arg2 arg1 arg0
f
fgaz gar goo arg2 arg1 arg0
#!/usr/bin/env bash
echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#
편집: 질문에 대한 내 의견을 참조하십시오.
Ravi의 코멘트가 본질적으로 정답이다.함수는 자체 인수를 사용합니다.명령줄 인수와 동일하게 하려면 해당 인수를 전달해야 합니다.그렇지 않으면 인수 없이 함수를 호출하는 것입니다.
즉, 명령줄 인수를 글로벌 배열에 저장하여 다른 함수에서 사용할 수 있습니다.
my_function() {
echo "stored arguments:"
for arg in "${commandline_args[@]}"; do
echo " $arg"
done
}
commandline_args=("$@")
my_function
, 「」를 참조해 주세요.commandline_args
「」가 아닙니다), 「」$@
,$1
,$2
등입니다만, 이용하실 수 있습니다.저는 인수 배열에 직접 할당하는 방법을 모릅니다만, 아는 사람이 있으면 가르쳐 주세요!
,, 금, 금, 지, 지, 지, 또, 또, 또, 또, 또, 또, also, also, also, also, also, also, also, also, also, also, also, also, also, also$@
할 수 - 이렇게 하면 됩니다.
# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*
function stuff {
# use script args via the variables you saved
# or the function args via $
echo $0 $*
}
# Call the function with arguments
stuff 1 2 3 4
이렇게도 할 수 있다
#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
echo $i
done;
}
argument $@
이제 스크립트를 다음과 같이 호출합니다.
./function_test.sh argument1 argument2
이것은 몇 가지 코멘트가 포함된 @mcarifio 응답입니다.
#!/bin/bash
shopt -s extdebug
function stuff() {
local argIndex="${#BASH_ARGV[@]}"
while [[ argIndex -gt 0 ]] ; do
argIndex=$((argIndex - 1))
echo -n "${BASH_ARGV[$argIndex]} "
done
echo
}
stuff
강조하고 싶은 점:
shopt -s extdebug
없으면요.BASH_ARGV
스크립트의 최상위 수준에서 사용하지 않는 한 어레이는 비어 있습니다(즉, 어레이의 외부).stuff
기능).상세내용은 이쪽:함수를 호출하기 전에 변수 BASH_ARGV의 사용 여부에 따라 함수의 값이 달라지는 이유는 무엇입니까?BASH_ARGV
는 스택이므로 인수는 역순으로 저장됩니다.그렇기 때문에 루프 내 인덱스를 감소시켜 올바른 순서로 인수를 얻을 수 있습니다.- 큰따옴표로 둘러싸다
${BASH_ARGV[@]}
및 그@
대신 지표로서*
공백이 있는 인수가 올바르게 처리되도록 하기 위해 필요합니다.세부 정보: bash 어레이 - ${#array_name[*]}와 ${#array_name[@]}의 차이점
shift 키워드(operator?)를 사용하여 반복할 수 있습니다.예:
#!/bin/bash
function print()
{
while [ $# -gt 0 ]
do
echo "$1"
shift 1
done
}
print "$@"
저는 이렇게 합니다.
#! /bin/bash
ORIGARGS="$@"
function init(){
ORIGOPT= "- $ORIGARGS -" # tacs are for sed -E
echo "$ORIGOPT"
}
인수를 명령줄에서 특정 함수로 전달하는 가장 간단하고 가능성이 높은 방법은 인수를 함수 호출에 직접 포함하는 것입니다.
# first you define your function
function func_ImportantPrints() {
printf '%s\n' "$1"
printf '%s\n' "$2"
printf '%s\n' "$3"
}
# then when you make your function call you do this:
func_ImportantPrints "$@"
이는 인수를 메인 또는 func_parseArguments(앞의 예에서 보듯이 케이스 스테이트먼트를 포함하는 함수)와 같은 함수나 스크립트의 함수 중 하나에 송신하는 경우에 편리합니다.
언급URL : https://stackoverflow.com/questions/2740906/how-to-access-command-line-arguments-of-the-caller-inside-a-function
'programing' 카테고리의 다른 글
목록 안으로 항목을 이동하시겠습니까? (0) | 2023.04.22 |
---|---|
필터링된 데이터의 행 수 (0) | 2023.04.22 |
bash에서 현재 파티션의 사용 가능한 디스크 공간을 확인하십시오. (0) | 2023.04.17 |
Windows에서 실행되는 Emacs용 .emacs 파일은 어디서 찾을 수 있습니까? (0) | 2023.04.17 |
Excel 스프레드시트 데이터를 기존 SQL 테이블로 Import하시겠습니까? (0) | 2023.04.17 |