itsource

내 Bash 스크립트에 전달된 모든 인수를 내 함수로 전달하는 방법은 무엇입니까?

mycopycode 2023. 4. 27. 22:23
반응형

내 Bash 스크립트에 전달된 모든 인수를 내 함수로 전달하는 방법은 무엇입니까?

제가 어떤 기능을 가지고 있다고 가정해 보겠습니다.abc()내 스크립트에 전달된 인수 분석과 관련된 논리를 처리합니다.

Bash 스크립트가 수신한 모든 인수를 에 전달하려면 어떻게 해야 합니까?abc()인수의 수는 가변적이므로 이렇게 전달된 인수를 하드 코딩할 수 없습니다.

abc $1 $2 $3 $4

더 좋은 것은, 내 함수가 스크립트 인수의 변수에 액세스할 수 있는 방법이 있습니까?

$@변수는 공백으로 구분된 모든 명령줄 매개 변수로 확장됩니다.여기 예가 있습니다.

abc "$@"

사용 시$@공백이나 와일드카드가 포함된 인수의 구문 분석이 잘못되지 않도록 항상 이중 괄호 안에 넣어야 합니다(아래 참조).이것은 여러 인수에 대해 작동합니다.또한 모든 POSIX 호환 셸에도 이식할 수 있습니다.

또한 주목할 필요가 있습니다.$0(스크립트 이름 또는 경로 지정)가 다음 위치에 없습니다.$@.

Bash 참조 매뉴얼 특수 매개 변수 섹션에 다음과 같이 나와 있습니다.$@하나부터 시작하여 위치 매개 변수로 확장됩니다.큰따옴표 내에서 확장이 발생하면 각 매개 변수는 별도의 단어로 확장됩니다.그것은"$@"와 동등합니다."$1" "$2" "$3"....

일부 인수 전달:

번째 인수를 제외한 모든 인수를 전달하려면 먼저 다음을 사용할 수 있습니다.shift첫 번째 주장을 "복수"하고 통과하는 것."$@"나머지 인수를 다른 명령으로 전달합니다.Bash(그리고 zsh와 ksh, 대시와 같은 일반 POSIX 셸에서는 아님)에서는 배열 슬라이싱의 변형을 사용하여 인수 목록을 어지럽히지 않고 이 작업을 수행할 수 있습니다."${@:3}"다음으로 시작하는 인수를 제공합니다."$3"."${@:3:4}"다음에서 시작하는 최대 4개의 인수를 제공합니다."$3"(즉,"$3" "$4" "$5" "$6"), 많은 인수가 전달된 경우.

하기 싫은 일:

"$*"모든 인수를 하나의 문자열(공백으로 구분하거나 의 첫 번째 문자)로 묶습니다.$IFSis). 이렇게 하면 인수 내 공백과 인수 간 공백의 구분이 사라지므로 일반적으로 좋지 않은 생각입니다.예를 들어, 인수를 인쇄하는 것은 괜찮을 수도 있습니다.echo "$*"구분 내/간격 공간을 보존하는 데 관심이 없다면 말입니다.

하는 방법(" " " " " " " " ( " " " " 처럼)args="$@" 매쉬합니다."$*"합니다.args=("$@")). (예를 들어 호를사배열됩이니다괄면용하▁(됩다),니괄▁e▁them▁as배열es이▁make▁andthe)로 참조합니다. 그런 다음 예를 들어 이를 참조합니다."${args[0]}" 및하므로 등. Bash 및 ksh에서는 배열 인덱스가 0에서 시작하므로$1입고예정에 입니다.args[0]etc하므로 zsh는 1부터 합니다.$1입고예정에 입니다.args[1]그리고 대시와 같은 더 기본적인 셸에는 배열이 전혀 없습니다.

개의 따옴표를 뺀에 개인제고하외를다, 중하로나음구용의두▁either▁leaving로,나▁off-하▁with,▁doubleotes▁thequ중.$@또는$*각의 단어 또는로하려고 합니다.$IFS또한 파일 이름 와일드카드처럼 보이는 항목을 일치하는 파일 이름 목록으로 확장합니다.이것은 정말 이상한 영향을 미칠 수 있으며, 거의 항상 피해야 합니다. (기본적으로 확장이 수행되지 않는 zsh에서는 제외)

저는 이것에 대한 변화가 필요했고, 다른 사람들에게 유용할 것으로 기대합니다.

function diffs() {
        diff "${@:3}" <(sort "$1") <(sort "$2")
}

"${@:3}"part 3으로 시작하는 합니다.따라서 이 함수는 처음 두 인수를 diff로 전달하여 정렬된 diff를 구현한 다음 다른 모든 인수를 diff로 전달하여 diff와 유사하게 호출할 수 있습니다.

diffs file1 file2 [other diff args, e.g. -y]

을 합니다.$@변수 - 공백으로 구분된 모든 명령줄 매개 변수로 확장됩니다.

abc "$@"

간단한 스크립트는 다음과 같습니다.

#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}

$#스크립트에서 받은 인수 수입니다.하는 것이 더 쉽다고 합니다: 어사를것이더쉽다습니는하세액레스용.args=("$@")를 줄에 .args하려면 배열을 사용합니다. 액세스하려면 사용합니다.${args[index]}.

이 구문으로 인수 범위를 지정할 수 있습니다.

function example() {
    echo "line1 ${@:1:1}"; #First argument
    echo "line2 ${@:2:1}"; #Second argument
    echo "line3 ${@:3}"; #Third argument onwards
}

언급된 것을 본 적이 없습니다.

가 "$@" 반적로정다답니입으일abc▁abc다@니정$답..su: unrecognized option '--myoption'실제로 저에게 효과가 있었던 것은 모든 인수를 단일 문자열로 전달하는 것이었습니다.

abc "$*"

나의 정확한 케이스(다른 사람이 필요하다고 확신합니다)는 나의 .bashrc에 있었습니다.

# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}
abc "$@"

$@스크립트에 변수가 됩니다.

언급URL : https://stackoverflow.com/questions/3811345/how-to-pass-all-arguments-passed-to-my-bash-script-to-a-function-of-mine

반응형