我想将其缩短为一行:
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 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`
cmd2
cmd1
如果返回则执行true
。如果满足以下任一条件,则cmd3
执行cmd1
或者cmd2
返回 false。
在您的情况下cmd2
( alias
) 不太可能返回 false,但在一般情况下很容易忘记该问题,因此最好首先避免该构造。
唯一的真实的它可能有用的原因是,当您想要编写在类似 Bourne 和类似 csh 的 shell(或rc
类似的 shell)中工作的代码时,其中if/then/else
构造具有不同的语法。