내 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"
), 많은 인수가 전달된 경우.
하기 싫은 일:
"$*"
모든 인수를 하나의 문자열(공백으로 구분하거나 의 첫 번째 문자)로 묶습니다.$IFS
is). 이렇게 하면 인수 내 공백과 인수 간 공백의 구분이 사라지므로 일반적으로 좋지 않은 생각입니다.예를 들어, 인수를 인쇄하는 것은 괜찮을 수도 있습니다.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
'itsource' 카테고리의 다른 글
AssertionError: 데이터베이스 연결이 UTC로 설정되지 않았습니다. (0) | 2023.05.02 |
---|---|
강력한 유형의 부분 뷰에 추가 뷰 데이터 전달 (0) | 2023.05.02 |
Visual Studio 새 브라우저 인스턴스를 열지 않음 (0) | 2023.04.27 |
분산 트랜잭션을 시작할 수 없습니다. (0) | 2023.04.27 |
git 커밋되지 않았거나 저장되지 않은 모든 변경 내용 실행 취소 (0) | 2023.04.27 |