CLI에서 직접 쉘 매개 변수 ($ 1,…, $ @)를 사용할 수 있습니까?


9

때로는 작은 예제에서 위의 변수를 에뮬레이트하고 확인해야하며 일부 스크립트 등에 즉시 복사 할 수 있습니다.

다음과 같은 방법으로 간단한 예제를 사용하여 해결하려고했습니다.

(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh

다른 조합과 함께. 또한 shebang 인터프리터 지시문을 추가하여 실험 #!/bin/sh -x했지만 원하는 결과를 얻지 못했습니다.

간단히 할 수 있습니까?


1
(find $1) /tmp구문 오류입니다. 실제로 (any-command) more-arguments구문 오류입니다. 당신이하려는 일을 다르게 설명 할 수 있습니까?
Celada

2
@Celada, 그것의 껍질에 구문 오류가 아니라 rc가족 ( rc, es, akanga...) 여기서 동등의 경우에 find $1 /tmp.
Stéphane Chazelas

답변:


15

후 첫 번째 인수 sh -c inline-script에 간다 $0(또한 오류 메시지에 사용되는), 나머지는 들어가 $1, $2...

$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg

그래서 당신은 원합니다 :

sh -c 'find "$1"' sh /tmp

(예전 sh에는 첫 번째 인수가 $1대신 구현 된 구현을 찾을 수 있으므로 다음을 수행하십시오.

sh -c 'find "$1"' /tmp /tmp

또는:

sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2

두 가지 행동을 모두 설명하기 위해 POSIX가 널리 보급되어 공개되었습니다.


설정하려는 경우 $1, $2당신이 기능을 사용 할 위치를 현재 쉘 내에서 로컬 범위에서, 그입니다. Bourne과 같은 껍질에서 :

my_func() {
  find "$1"
}
my_func /tmp

일부 쉘은 익명 함수를 지원합니다. 그 경우입니다 zsh:

(){find "$1"} /tmp

또는 es:

@{find $1} /tmp

현재 위치 매개 변수를 변경하기 위해 구문은 쉘에 따라 다릅니다. dchirikov 이미 본쉘 커버하고있다 (쉘, 콘 쉘 bash, zsh, POSIX, ash, yash...)을.

구문은 다음과 같습니다.

set arg1 arg2 ... argn

그러나 다음이 필요합니다.

set --

해당 목록을 비우려면 (또는 shift "$#")

set -- -foo

또는로 $1시작하는 것으로 설정 하려면 위치 매개 변수 목록의 끝에 인수를 추가 하는 등 임의의 데이터를 사용할 때 항상 사용하는 것이 좋습니다 .-+set --set -- "$@" other-arg

csh패밀리 ( csh, tcsh) 의 쉘 에서 argv배열에 할당합니다 .

set argv=(arg1 arg2)

의 껍질에서 rc가족 ( rc, es, akanga)는에 *배열 :

*=(arg1 arg2)

요소를 개별적으로 할당 할 수도 있지만 :

2=arg2

에서는 fish, 위치 매개 변수에 argv배열 (NO $1, $@도)

set argv arg1 arg2

에서 zsh와의 호환성 csh을 위해 argv배열에 할당 할 수도 있습니다 .

argv=(arg1 arg2)
argv[4]=arg4

그리고 당신은 또한 할 수 있습니다 :

5=arg5

즉, 다음과 같은 작업도 수행 할 수 있습니다.

argv+=(another-arg)

끝에 인수를 추가하려면 다음을 수행하십시오.

argv[-1]=()
argv[2]=()

끝이나 중간에서 인수를 제거하면 다른 쉘로는 쉽게 할 수 없습니다.


7
set --

필요한 것입니다 :

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.