"변수 a에 'abc' 패턴이 있는 경우 x를 수행하고, 그렇지 않으면 y를 수행"하는 방법(1줄)

"변수 a에 'abc' 패턴이 있는 경우 x를 수행하고, 그렇지 않으면 y를 수행"하는 방법(1줄)

한 줄에 환경변수 패턴 일치에 따라 별칭을 설정하고 싶습니다.

나는 노력하고 있습니다 :

[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

하지만 나는 얻는다-bash: [[uscamwebq20.boston.zipcar.com: command not found

나는 또한 다음을 시도했습니다.

$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'

하지만 나는 얻는다-bash: [: too many arguments

답변1

case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac

특정 문자열이 비어 있는지 테스트하기 위한 것이므로 [[공백 이 누락되었기 때문에 오류가 발생합니다 . 는 비표준 기능이므로 작동 방식은 의 버전에 따라 다릅니다 . 구조 는 POSIX이며 작성된 대로 모든 POSIX 셸 및 모든 버전의 .-z[[bashcasebash

cmd1 && cmd2 || cmd3보다 일반적으로 실패 하면 일반적으로 원하는 작업을 수행하지 않으므로 이러한 작업을 멀리하는 것이 좋습니다 cmd2.

또한 모든 것을 한 줄에 넣는 것이 의미가 없습니다. 그게 rc 파일에 들어갈 내용이죠, 그렇죠? 그러면 여러 줄로 작성하면 훨씬 더 읽기 쉽습니다.

case $HOSTNAME in
  (*q20*) alias a='cd ~/a1';;
      (*) alias a='cd ~/a99'
esac

다음보다 읽기 쉽고 이식성이 뛰어납니다.

if [[ $HOSTNAME =~ q20 ]]; then
  alias a='cd ~/a1'
else
  alias a='cd ~/a99'
fi

다음보다 더 읽기 쉽고 정확합니다.

[[ $HOSTNAME =~ q20 ]] &&
  alias a='cd ~/a1' ||
  alias a='cd ~/a99'

그 자체보다 더 읽기 쉽습니다.

[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

답변2

첫 번째 형식을 사용할 수 있지만 뒤에 공백을 넣어야 합니다 [[. 보다:

$ type [[
[[ is a shell keyword

$ help [[
[[ ... ]]: [[ expression ]]
    Execute conditional command.

따라서 명령은 다음과 같아야 합니다.

[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

관련 정보