글쓴이 보관물: 소장 마

변수 대체에 명령 대체를 중첩시킬 수 있습니까? clipboard Here’s a string I

명령을 통해 액세스하는 특정 문자열에 변수 대체를 사용하고 싶습니다. 예를 들어 클립 보드에 무언가를 복사하면 다음과 같이 액세스 할 수 있습니다.

$ xclip -o -selection clipboard
Here's a string I just copied.

변수에 변수를 할당하면 변수를 대체 할 수 있습니다.

$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.

그러나 변수에 변수를 할당하지 않고 변수 대체를 수행하는 방법이 있습니까? 개념적으로 이와 같은 것.

$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution

이 구문 var은 문자열이 아니라 변수 이름이어야 하므로 실패 합니다.



답변

아냐, 못해 bash대부분의 다른 쉘 (제외 zsh)은 중첩 된 대체를 허용하지 않습니다.

을 사용하면 중첩 대체를zsh 수행 할 수 있습니다 .

$ echo ${$(echo 123)/123/456}
456


답변

네, 그렇게 할 수 있습니다. 정말 예쁘지 않습니다. 중첩보다 인라인 과 비슷 합니다. 문제는 확장 한 매개 변수의 값을 조작해야한다는 것입니다. 해당 매개 변수에 값이 없으면 별다른 조치를 취하지 않아도됩니다. 따라서 값 확장 하면서 할당 할 수 있으며 바로 가기가 아닙니다.

v=; echo "${v:=${0##*["$0${v:=$(xsel -bo)}"]}${v/copi/knott}}"

$0체인 내 에서 param 확장을 사용하여 과제 를 숨 깁니다 . 중첩 된 할당 확장 내에서 var의 값을 할당합니다. 바깥 쪽이 우선합니다. 그러나 안쪽 쪽이 말한대로 확장되기 때문입니다. 그러나 내부 확장을 끄면 원하는 것을 얻을 수 있습니다. 내 클립 보드에 문자열을 복사 한 후 (나는이 없습니다 xclip– 단지 xsel) 는 인쇄 :

Here's a string I just knotted.

$0그래도 나가면 무슨 일이 일어나고 있는지 좀 더 명확합니다 .

v=; echo "${v:=${v:=$(xsel -bo)}${v/copi/knott}}"

인쇄 :

Here's a string I just copied.  Here's a string I just knotted.

내부 할당이 수정 전에 발생하기 때문에, 외부 할당이 우선하며 내부 할당의 확장 수정 된 내부 확장으로 확장됩니다.

물론 대상 매개 변수가 이미 할당 된 경우 그중 아무것도 작동하지 않습니다. 따라서 처음에 변수를 비우면 확실하게 수행 할 수 있습니다 … 솔직히 말하면 아마도 가장 편리한 시간입니다. .


답변

변수를 만들지 않으려면 문자열 대체를 수행하는 다른 방법이 있습니다.

$ echo $(xclip -o -selection clipboard | sed 's/copi/knott/')
Here's a string I just knotted.


답변