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에는 공백으로 구분 된 모든 명령 줄 매개 변수로 확장되는 "$ @"변수가 있습니다.
에서 배쉬 예에 의해 .
I realize this has been well answered but here's a comparison between "$@" $@ "$*" and $*
Contents of test script:
# 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 "================================="
Now, run the test script with various arguments:
# ./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;
Just thought this may be a bit more useful when trying to test how args come into your script
My SUN Unix has a lot of limitations, even "$@" was not interpreted as desired. My workaround is ${@}. For example,
#!/bin/ksh
find ./ -type f | xargs grep "${@}"
By the way, I had to have this particular script because my Unix also does not support grep -r
If you include $@
in a quoted string with other characters the behavior is very odd when there are multiple arguments, only the first argument is included inside the quotes.
Example:
#!/bin/bash
set -x
bash -c "true foo $@"
Yields:
$ bash test.sh bar baz
+ bash -c 'true foo bar' baz
But assigning to a different variable first:
#!/bin/bash
set -x
args="$@"
bash -c "true foo $args"
Yields:
$ bash test.sh bar baz
+ args='bar baz'
+ bash -c 'true foo bar baz'
Works fine, except if you have spaces or escaped characters. I don't find the way to capture arguments in this case and send to a ssh inside of script.
This could be useful but is so ugly
_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/4824590/propagate-all-arguments-in-a-bash-shell-script
'Program Tip' 카테고리의 다른 글
Javascript call () 및 apply () 대 bind ()? (0) | 2020.09.29 |
---|---|
VirtualBox 가상 머신에서 localhost 주소 지정 (0) | 2020.09.29 |
특정 파일 / 폴더를 제외한 tar 디렉토리에 대한 쉘 명령 (0) | 2020.09.29 |
jar- 파일을 실행할 수 없습니다 :“no main manifest attribute” (0) | 2020.09.28 |
AssemblyVersion, AssemblyFileVersion 및 AssemblyInformationalVersion의 차이점은 무엇입니까? (0) | 2020.09.28 |