
환경 변수가 있는 경우:
$foo=/my/path/one:/my/path/two
어떻게 설정할 수 있나요?
$bar=${foo}/bin
어디:
$bar=/my/path/one/bin:/my/path/two/bin
?
위에서 수행한 작업은 다음과 같은 작업만 수행합니다(첫 번째 경로에 /bin이 부족하지 않음).
$bar=/my/path/one/:/my/path/two/bin
수동으로 설정하거나 목록에서 반복할 수 있지만 이유 없이 복잡해 보입니다. 이를 수행하는 영리한 한 줄 방법이 있습니까?
답변1
제가 보기에 당신은 이것을 갖고 싶어합니다:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
답변2
가장 강력하지는 않지만 아마도 가장 간단한 것은 /bin:
매개변수 확장을 사용하여 모든 콜론을 바꾸는 것입니다.
foo=/my/path/one:/my/path/two:/my/path/three
noo=${foo//:/\/bin:}/bin
echo $noo
/my/path/one/bin:/my/path/two/bin:/my/path/three/bin
설명:
이 구문을 사용하면 ${foo}
변수에서 다양한 검색 및 바꾸기를 수행할 수 있습니다. 이 경우 패턴 일치를 사용하며 패턴은 슬래시로 구분됩니다. 일반적으로 다음과 같이 할 수 있습니다.
$(foo/findme/replace}
findme
그러면 문자열을 찾아 $foo
로 바꿀 것입니다 replace
.
콜론을 로 바꾸려면 x
로 검색할 수 있지만 ${foo/:/x/}
첫 번째 것만이 아닌 모두를 바꾸려면 시작 부분에 두 개의 슬래시를 넣습니다. 교체에 슬래시를 사용하려면 백슬래시로 이스케이프 처리해야 합니다.\/
모두 합쳐서 위에 사용된 패턴을 제공합니다(명확성을 위해 공백을 추가했지만 실제 생활에서는 깨질 수 있음).
<find> <replace>
${foo // : / \/bin: }
나머지는 역사이다.