Bash 및 zsh의 이중 및 삼중 대체

Bash 및 zsh의 이중 및 삼중 대체

후속 백엔드 부분이 문제.

I 는 이중 교체 bash에 사용될 수 있습니다 . 두 경우 모두 구식(hack-y)이 작동합니다.${!FOO}zsh ${(P)FOO}eval \$$FOO

그래서 나에게 가장 현명하고 가장 논리적인 것은 ${${FOO}}, ${${${FOO}}}…이중/삼중/n 치환입니다. 왜 예상대로 작동하지 않습니까?

둘째: 진술 \의 기능은 무엇입니까 eval? 나는 그것이 경찰 아웃이고 일을 eval \$$$FOO불가능하게 만든다고 생각합니다. 모든 쉘에서 작동하는 삼중 /n 대체를 어떻게 사용할 수 있습니까?

답변1

(현재 프로세스 ID)의 확장을 \방지하기 위해 사용해야 합니다 . $$삼중 교체의 경우 이중 평가가 필요하므로 각 평가에서 불필요한 확장을 피하기 위해 더 많은 이스케이프가 필요합니다.

#! /bin/bash
l0=value
l1=l0
l2=l1
l3=l2
l4=l3

echo $l0
eval echo \$$l1
eval eval echo \\$\$$l2
eval eval eval echo \\\\$\\$\$$l3
eval eval eval eval echo \\\\\\\\$\\\\$\\$\$$l4

답변2

#!/bin/bash

hello=world
echo=hello

echo $echo ${!echo}

답변3

값이 FOO유효한 변수 이름(예: BAR)이라고 가정하고, eval \$$FOO값을 BAR별도의 단어로 분할하고, 각 단어를 와일드카드 패턴으로 처리하고, 결과의 첫 번째 단어를 명령으로 실행하고, 다른 단어를 인수로 전달합니다. 달러 앞의 백슬래시는 문자 그대로 처리되므로 eval내장 함수에 전달되는 인수는 4자 문자열입니다 $BAR.

${${FOO}}문법 오류입니다. 일반적인 쉘에는 그러한 기능이 없기 때문에 "이중 대체"를 수행하지 않습니다(이 구문은 어쨌든 사용되지 않습니다). zsh에서는${${FOO}} 작동하고 이중 대체이지만 원하는 것과 다르게 동작합니다. value 에 대해 두 번의 연속 변환을 수행합니다. FOO둘 다 ID 변환이므로 이를 작성하는 멋진 방법일 뿐입니다 ${FOO}.

변수의 값을 변수로 처리하려면 올바르게 인용해야 합니다. 결과를 변수로 설정하면 훨씬 쉬울 것입니다.

eval "value=\${$FOO}"

답변4

왜 이 작업을 수행해야 합니까?

다음과 같은 몇 가지 단계를 거쳐 언제든지 이 작업을 수행할 수 있습니다.

eval "l1=\${$var}"
eval "l2=\${$l1}"
...

또는 다음 기능을 사용하십시오:

deref() {
  if [ "$1" -le 0 ]; then
    eval "$3=\$2"
  else
    eval "deref $(($1 - 1)) \"\${$2}\" \"\$3\""
  fi
}

그 다음에:

$ a=b b=c c=d d=e e=blah
$ deref 3 a res; echo "$res"
d
$ deref 5 a res; echo "$res"
blah

FWIW, 주소 zsh:

$ echo ${(P)${(P)${(P)${(P)a}}}}
blah

관련 정보