bash 쉘 스크립트에서 모든 인수를 전파하십시오.
다른 스크립트를 호출하는 매우 간단한 스크립트를 작성 중이며 현재 스크립트에서 실행중인 스크립트로 매개 변수를 전파해야합니다.
예를 들어, 내 스크립트 이름은 foo.sh
및 전화bar.sh
foo.sh :
bar $1 $2 $3 $4
각 매개 변수를 명시 적으로 지정하지 않고 어떻게해야합니까?
실제로 매개 변수가 동일하게 전달되도록하려면 "$@"
일반 대신 사용하십시오 $@
.
관찰 :
$ cat foo.sh
#!/bin/bash
baz.sh $@
$ cat bar.sh
#!/bin/bash
baz.sh "$@"
$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4
$ ./foo.sh first second
Received: first
Received: second
Received:
Received:
$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:
$ ./bar.sh first second
Received: first
Received: second
Received:
Received:
$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:
들어 bash는 다른 본쉘 :
java com.myserver.Program "$@"
사용하십시오 "$@"
(모든 POSIX 호환 가능).
[...], bash는 "$ @"변수를 특징으로하며, 공백으로 구분 된 모든 명령 행 매개 변수로 확장됩니다.
에서 배쉬 예에 의해 .
나는 이것이 잘 대답되었음을 알지만 여기에 "$ @"$ @ "$ *"와 $ *의 비교가 있습니다.
테스트 스크립트의 내용 :
# cat ./test.sh
#!/usr/bin/env bash
echo "================================="
echo "Quoted DOLLAR-AT"
for ARG in "$@"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-AT"
for ARG in $@; do
echo $ARG
done
echo "================================="
echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
echo $ARG
done
echo "================================="
이제 다양한 인수로 테스트 스크립트를 실행하십시오.
# ./test.sh "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================
#!/usr/bin/env bash
while [ "$1" != "" ]; do
echo "Received: ${1}" && shift;
done;
args가 스크립트에 어떻게 들어오는 지 테스트 할 때 이것이 더 유용 할 것이라고 생각했습니다.
내 SUN Unix에는 많은 제한이 있으며 "$ @"도 원하는대로 해석되지 않았습니다. 해결 방법은 $ {@}입니다. 예를 들어
#!/bin/ksh
find ./ -type f | xargs grep "${@}"
그건 그렇고, 유닉스가 grep -r을 지원하지 않기 때문에이 특정 스크립트를 가져야했습니다.
$@
다른 문자와 함께 따옴표로 묶은 문자열에 포함하면 여러 인수가있을 때 동작이 매우 이상하며 첫 번째 인수 만 따옴표 안에 포함됩니다.
예:
#!/bin/bash
set -x
bash -c "true foo $@"
수율 :
$ bash test.sh bar baz
+ bash -c 'true foo bar' baz
그러나 먼저 다른 변수에 할당하십시오.
#!/bin/bash
set -x
args="$@"
bash -c "true foo $args"
수율 :
$ bash test.sh bar baz
+ args='bar baz'
+ bash -c 'true foo bar baz'
공백이나 이스케이프 문자가있는 경우를 제외하고는 잘 작동합니다. 이 경우 인수를 캡처하여 스크립트 내부의 ssh로 보내는 방법을 찾지 못했습니다.
이것은 유용 할 수 있지만 너무 추합니다
_command_opts=$( echo "$@" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' )
참고 URL : https://stackoverflow.com/questions/3190818/pass-all-arguments-from-bash-script-to-another-command
'IT' 카테고리의 다른 글
쉘에서 문자열을 나누고 마지막 필드를 얻는 방법 (0) | 2020.03.24 |
---|---|
사용중인 Angular 버전을 어떻게 확인할 수 있습니까? (0) | 2020.03.24 |
GitHub의 명령 행에서 풀 요청을 발행 할 수 있습니까? (0) | 2020.03.24 |
시스템 오버레이 창 만들기 (항상 상단) (0) | 2020.03.24 |
body-parser는 express와 어떤 관계가 있습니까? (0) | 2020.03.24 |