如何使用 [] 格式缩短 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'

但我总是得到“else”别名而不是“then”别名

我可以扭转它,但我怀疑,因为它不能正常工作,所以没有帮助。唯一确定的方法是在 OSX 上尝试一下,我现在在 ubuntu 上。

答案1

太长;博士;

使用

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

详细信息...
[...]只需要评估条件表达式(文件统计、字符串比较、数字比较;请参阅CONDITIONAL EXPRESSIONSbash(1)。在构造中也需要它们if ... ; then ...; else

对于相对简单的结构

if CONDITION; then
    EXPR1
else
    EXPR2
fi

可以替换为

CONDITION && EXPR1 || EXPR2

如果在第一种情况下不需要[...],那么在第二种情况下也不需要它。

在你的情况下CONDITIONls --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返回 false。

在您的情况下cmd2( alias) 不太可能返回 false,但在一般情况下很容易忘记该问题,因此最好首先避免该构造。

唯一的真实的它可能有用的原因是,当您想要编写在类似 Bourne 和类似 csh 的 shell(或rc类似的 shell)中工作的代码时,其中if/then/else构造具有不同的语法。

相关内容