때로는 작은 예에서 위의 변수를 시뮬레이션하고 검증해야 하며, 이는 즉시 일부 스크립트 등에 복사될 수 있습니다.
다음과 같은 간단한 예를 사용하여 해결해 보았습니다.
(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, bash
POSIX 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