Bash 매개변수 확장은 정확히 일치하는 항목만 대체합니다.

Bash 매개변수 확장은 정확히 일치하는 항목만 대체합니다.

''$VAR이 무언가와 일치하는 경우에만 bash 매개변수 확장을 사용하여 대체할 수 있습니까?'value' 정확히?

시작 부분을 ${VAR#value}제거 하고 마찬가지로 끝에서도 제거하는 구문이 있습니다 . 이는 으로 대체되지만 , or 와 같은 것이라면 로 대체할 수 있지만 , 그러한 경우에는 동일하게 유지되어야 합니다.value$VAR${VAR%value}value''$VARvalue11value1

명령문을 사용하여 이 작업을 수행 할 수 있다는 것을 알고 있지만 특정 값과 같으면 표시되지 않는 if내용을 명령문에 추가하려고 합니다. 이것이 바로 매개변수 확장이나 다른 종류의 내부 확장을 사용해야 하는 이유입니다. PS1접속사 구문.

답변1

다음 매개변수 확장을 선택할 수 있습니다 $().

PS1='$( [[ "${VAR}" == value ]] || printf %s "${VAR}" )$ '

값에서 후행 개행 문자를 제거합니다 $VAR.

답변2

또는 ksh93 스타일 zsh로 전환하는 옵션이 제공되는 경우 .${VAR:#value}${VAR/#%value}

${var/pattern[/replacement]}ksh93에서 bash로도 복사되었습니다. ksh93을 사용하면 검색을 시작 ${var/#pattern}이나 끝 으로 고정할 수 있지만 ${var/%pattern}둘을 결합할 수는 없습니다. bash도 마찬가지지만 zsh도 마찬가지입니다 ${var/#%pattern}.

바라보다info zsh 'Parameter Expansion'더 알아보기.

extendedglob옵션을 활성화하면 glob 패턴 (#s)연산자 (#e)(와일드카드 플래그)는 주제의 start(regex와 같은 ^) 및 nd(regex와 같은)와 각각 일치하므로 그 뒤에는 or 또는를 사용할 수도 있습니다.e$set -o extendedlob${VAR/(#s)value(#e)}${VAR#value(#e)}${VAR%(#s)value}


프롬프트 확장에 관한 것이라면 다음과 같이 후크 precmd(또는 $PROMPT_COMMANDbash)에 포함될 텍스트를 준비하는 것이 좋습니다.

prompt-from-VAR() {
  case $VAR in
    (value) psvar[1]=;;
    (something-else) psvar[1]=OTHER;;
    (*) psvar[1]=$VAR;;
  esac
}
autoload add-zsh-hook
add-zsh-hook precmd prompt-from-VAR
PS1='%1v$ '

(여기에서는 더 위험한 옵션 대신 $psvar사용 됩니다 ).%vprompsubst

Bash에는 이에 상응하는 항목 psvar이나 후크가 없습니다 precmd.

PROMPT_COMMAND="$PROMPT_COMMAND"'
  case $var in
    (value) promt_VAR=;;
    (something-else) prompt_VAR=OTHER;;
    (*) prompt_VAR=$VAR;;
  esac'
PS1='${prompt_VAR}$ '

관련 정보