스크립트 명령 줄 인수에 액세스하는 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 $*
답변
bash ref 매뉴얼을 읽었을 때 “스택”에 대해 많이 언급하지만 BASH_ARGV에이 내용이 캡처되었다고합니다.
#!/bin/bash
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
farg2 arg1 arg0
g goo gar gaz
garg2 arg1 arg0
f
farg2 arg1 arg0
답변
인수 C 스타일 (인수 배열 + 인수 수)을 사용하려면 $@
및 을 사용할 수 있습니다 $#
.
$#
인수의 수를 제공합니다.
$@
당신에게 모든 논쟁을 제공합니다. 을 사용하여 이것을 배열로 바꿀 수 있습니다 args=("$@")
.
예를 들면 다음과 같습니다.
args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}
여기에 ${args[0]}
실제로 스크립트의 이름이 아니라 첫 번째 인수가 있습니다.
답변
#!/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
, 등,하지만 그들은 사용할 수있어. 인수 배열에 직접 할당하는 방법을 알지 못하지만 누군가가 아는 경우 저를 계몽하십시오!
또한 내가 사용하고 인용 한 방식에 유의하십시오. $@
이것이 특수 문자 (공백)가 엉망이되지 않도록하는 방법입니다.
답변
# 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
답변
시프트 키워드 (연산자?)를 사용하여 반복 할 수 있습니다. 예:
#!/bin/bash
function print()
{
while [ $# -gt 0 ]
do
echo $1;
shift 1;
done
}
print $*;
