[] 형식을 사용하여 if then else를 어떻게 단축할 수 있나요?

[] 형식을 사용하여 if then else를 어떻게 단축할 수 있나요?

나는 이것을 하나의 라이너로 줄이고 싶습니다.

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi

[]나는 조건문에 자주 사용 [ -z(or -n) condition]하지만 아직 이 형식에서 다른 부분을 수행할 필요는 없었습니다.

Ruby에서는 그렇게 할 것입니다. condition ? true : false Bash에도 동등한 것이 있습니까?

나는 노력했다

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'

하지만 분명히 그것은 올바른 방법이 아닙니다.

.bashrc나는 모든 내용을 작은 창(< ~50줄)에 맞추기를 원하기 때문에 단일 라이너를 원합니다. 그래서 다른 다중 라이너와 마찬가지로 가능하면 이를 하나의 라이너로 압축합니다. 이 예에서는 크기 때문에 가독성을 희생하는 것이 편합니다.

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

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

그리고

[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

그리고

[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

하지만 나는 항상 'then' 별칭이 아닌 'else' 별칭을 얻습니다.

그냥 되돌릴 수도 있지만 제대로 작동하지 않으므로 도움이 되지 않을 것 같습니다. 확실하게 할 수 있는 유일한 방법은 OSX에서 시도해 보는 것입니다. 저는 지금 우분투를 사용하고 있습니다.

답변1

tl;dr;

사용

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`

세부 사항....
[...]조건식(파일 통계, 문자열 비교, 숫자 비교, 참조)을 평가하는 데만 필요 CONDITIONAL EXPRESSIONS합니다 bash(1). 그들은 또한 구조에서 그것을 위해 필요할 것입니다 if ... ; then ...; else.

비교적 간단한 구성의 경우

if CONDITION; then
    EXPR1
else
    EXPR2
fi

로 대체될 수 있다

CONDITION && EXPR1 || EXPR2

첫 번째 경우에 필요하지 않으면 [...]두 번째 경우에도 필요하지 않습니다.

귀하의 경우 는 의 반환 코드 CONDITION입니다 . 그러니까 그냥 쓰셔도 돼요ls --version 2>/dev/null | grep -q 'coreutils'grep

ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'

참고: 직접 ls지원하는지 확인하는 것이 더 쉬울 것입니다 .--color

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'

답변2

를 사용하면 zsh다음과 같이 압축할 수 있습니다.

if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}

if/then/else를 대체하는 구문 cmd1 && cmd2 || cmd3은 전혀 동일하지 않으므로 일반적으로 피해야 합니다.

~ 안에

cmd1 && cmd2 || cmd3`

cmd2cmd1반환 되면 실행됩니다 true. 그리고 cmd3다음 중 하나라도 실행됩니다.cmd1 또는cmd2거짓을 반환합니다.

귀하의 경우 cmd2( alias)는 false를 반환할 가능성이 거의 없지만 일반적인 경우 문제를 잊어버리기 쉽기 때문에 처음부터 해당 구성을 피하는 것이 가장 좋습니다.

유일한진짜이것이 유용할 수 있는 이유는 구성이 다른 구문을 갖는 Bourne 및 csh 유사 쉘(또는 rc작동하는 쉘과 유사한 쉘) 모두에서 작동하는 코드를 작성하려는 경우입니다 .if/then/else

관련 정보