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

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

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

다음과 같은 간단한 예를 사용하여 해결해 보았습니다.

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

그리고 다른 조합. 또한 shebang 인터프리터 지시문을 추가해 보았지만 #!/bin/sh -x원하는 결과를 얻지 못했습니다.

이거 간단하게 할 수 있나요?

답변1

그 후 첫 번째 인수가 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는 Bourne과 같은 껍질을 덮었습니다.(Byrne, Cohen, bashPOSIX zsh,, 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오직( $1여기는 아님 $@):

set argv arg1 arg2

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

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

다음과 같이 할 수도 있습니다.

5=arg5

이는 다음 작업도 수행할 수 있음을 의미합니다.

argv+=(another-arg)

끝에 매개변수를 추가하고 다음을 수행합니다.

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

끝이나 중간에서 인수를 제거합니다. 이는 다른 쉘에서는 쉽게 수행할 수 없는 작업입니다.

답변2

set --

당신이 필요로하는 것입니다 :

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc

관련 정보