쉘에서 $ {$ #}이 $$와 동일한 결과를 리턴하는 이유는 무엇입니까?


18

에서 마지막 위치 매개 변수를 가져 /bin/dash오려고 시도했지만 시도했습니다 echo ${$#}. 놀랍게도 이로 인해 오류가 발생하지 않았지만 $$가변 내용 과 동일한 PID에 오류가 발생했습니다 . 질문, 왜 그 구문이 효과가 있었습니까? 여기서 쉘이 적용한 구문 규칙은 무엇입니까?

기본적으로 내가 한 일은

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

분명히, %그런 구조에서 캐릭터도 무시됩니다.

$ echo ${$%}
13819

그러나 *@나쁜 대체 오류가 발생합니다 :

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
무엇을 기대 ${$*}하고 ${$@}생산합니까?
Kusalananda

2
@Kusalananda 기대치가 없습니다. 나는 옆에 다른 캐릭터 #%그 결과로 어떤 행동 을 시도 하고 있었습니까?
Sergiy Kolodyazhnyy

1
실제로 대시, 사용 간접 작업을 수행하려면 eval예를 들어, dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. 출처 : 우분투 위키
wjandrea

1
@wjandrea Yep, 이미 알고 있습니다. : 거기에 대한 질문은 이미 사실이다 stackoverflow.com/questions/1853946/... 먼저 질문을 읽지 않고 나 자신에 의해 방법을 찾기 위해 노력했다 (난 이미 알고있는 for i; do true; done마지막 항목에를 얻기 위해 $i)하지만, 더 우아한 뭔가를 찾고 있었다. eval물론 어느 정도까지 생각할 수있는 잠재적 문제가있을 수 있습니다. 그것은 또 다른 주제입니다. 그러나 예, 옵션입니다
Sergiy Kolodyazhnyy

답변:


35

이다 $$ 빈 접두사를 제거하여 :

${parameter#[word]}

가장 작은 접두사 패턴을 제거합니다 . 단어 패턴을 생성하기 위해 확장해야한다. 파라미터의 확장은 발생한다 파라미터 패턴 일치 프리픽스의 작은 부분을 삭제하여,. 있는 경우 단어 는 따옴표로 시작하지 않아야합니다 #.

%(접미사)도 마찬가지 입니다. @그리고 *그래서 그들은 오류이며, 확장 수정 매개 변수 수 없습니다. 그것은을 위해 일어날 것 $?, $-또는 가상 $=도. ${$+}빈 확장입니다.


바로 거기에서 매개 변수 대체를 인식 했어야합니다. 잘 잡았습니다.
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.