다음과 같은 효과를 얻고 싶지만 방법을 모르겠습니다.
$> A='/dir'
$> B="$A/bin"
$> echo $B
/dir/bin
$> A='/other'
$> echo $B
/other/bin
어떤 아이디어가 있나요?
답변1
Ksh93에는 하나의 변수가 다른 변수에 대한 간접 참조가 될 수 있는 제한된 형식이 있습니다.
$ A=/dir
$ typeset -n B=A
$ echo $B
/dir
$ A=/other
$ echo $B
/other
일반적인 쉘은 변수를 두 번 확장하지 않습니다. Bash에는 ksh의 간접 참조 기능과 유사하지만 구문이 다릅니다. 정의 시가 아닌 액세스 시 간접 참조를 원하도록 지정해야 합니다.
$ A=/dir
$ B=A
$ echo ${!B}
/dir
$ A=/other
$ echo ${!B}
/other
일반적으로 변수의 값은 변수에 할당될 때만 변경됩니다. 방문할 때마다 재계산되는 것을 원하신다면,명령 출력 검색.
PATH
및 와 같은 다른 프로그램에서 사용하는 변수의 값을 동적으로 변경하려는 경우 LD_LIBRARY_PATH
셸에 있는 고급 기능이 무엇이든 상관없이 이는 불가능합니다. 프로그램이 시작되면 해당 환경 변수는 시작 시 수신된 것과 동일한 변수입니다. 셸에서 값을 변경해도 이미 실행 중인 프로세스의 값에는 영향을 미치지 않습니다.
일부 이벤트에 따라 이러한 변수의 값을 변경하려면 셸 코드를 실행하면 됩니다. 예를 들어 bash에 일부 코드를 실행하도록 요청할 수 있습니다.프롬프트가 표시될 때마다또는현재 디렉토리가 변경될 때. 다시 말하지만 이는 이미 실행 중인 프로그램에는 영향을 주지 않습니다.
답변2
템플릿 변수와 같은 것을 원한다면 eval
확장할 수 있습니다...
A=/dir
B=\$A/bin
eval echo $B
A=/other
eval echo $B
답변3
변수는 이와 같이 동작하지 않습니다. 네가 원하는 건 하나야기능:
B () {
echo "$A/bin"
}
A=/dir
echo $(B)
A=/other
echo $(B)