[bash] 함수 내에서 호출자의 명령 줄 인수에 액세스하는 방법은 무엇입니까?

스크립트 명령 줄 인수에 액세스하는 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 $*;