Bash에서 문자열 시작 부분에서 점과 슬래시를 제거하는 방법은 무엇입니까?

Bash에서 문자열 시작 부분에서 점과 슬래시를 제거하는 방법은 무엇입니까?

./의 처음부터 삭제하고 싶습니다 ./Accounts.

이것은 내 스크립트입니다.

export Item=./Accounts
echo $Item
export ReplacedItem=${$Item/.\//}
echo $ReplacedItem

하지만 나는 다음을 얻습니다.

main.sh: 3행: 교체된항목=${$Item/.//}: 잘못된 교체

내가 뭘 잘못했나요?

답변1

표준 연산자 1이 사용되며 여기에는 ksh93 스타일 연산자가 sh ${param#pattern}필요 하지 않습니다.${param/pattern/replacement}${$param/pattern/replacement}

게다가 다른 명령이 이를 상속하도록 원하지 않는 한 이러한 변수를 내보낼 필요가 없습니다. 또한 echo임의의 데이터를 인쇄하는 데 사용할 수 없으며 매개변수 확장이 에 있어야 한다는 점을 기억하세요 bash.

Item=./Accounts
printf '%s\n' "$Item"
ReplacedItem="${Item#./}"
printf '%s\n' "$Item"

ksh93 스타일을 사용하는 경우 ${param/pattern/replacement}다음과 같아야 합니다.

ReplacedItem="${Item/.\//}"

/대체 항목이 빈 문자열인 경우 패턴과 대체 항목 이전 항목을 생략할 수 있습니다.

ReplacedItem="${Item/.\/}"

그러나 시작 부분이 아니더라도 ./in 의 첫 번째 항목을 제거한다는 점에 유의하십시오 . $Item처음에만 제거하려면 #패턴 시작 부분에 추가하면 됩니다.

ReplacedItem="${Item/#.\/}"

(그러나 다시 말하지만, 표준에 비해 이점이 없습니다 ${Item#./}).


원래 ksh85에 이미 존재하고 sh90년대 초반 POSIX에 의해 지정된 ksh에서 유래되었으므로 sh.bashsh

² 최소한 목록 컨텍스트에 있는 항목입니다. var=$param( 가스칼라대신 변수목록/대량으로변수) 및 기타 비목록 컨텍스트도 있지만 문제가 되지는 않습니다.

관련 정보