[] 形式を使用して 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]この形式で else 部分を実行する必要はまだありません。

Ruby では次のようにします。bashcondition ? true : false に同等のものはありますか?

私は試した

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

しかし、明らかにそれは正しいやり方ではありません。

すべてを.bashrc小さめのウィンドウ (< ~50 行) に収めたいので、ワンライナーにしたいので、他のマルチライナーと同様に、可能な場合は 1 ライナーに凝縮し​​ます。この例では、サイズのために読みやすさを犠牲にしてもかまいません。

私も試しました:

[ -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 で試してみることです。現在、私は 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

最初のケースで必要ない場合は[...]、2 番目のケースで必要ありません。

あなたの場合、 は の戻りコードです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 またはcmd2false を返します。

あなたの場合、cmd2( alias) が false を返す可能性は非常に低いですが、一般的なケースでは問題を忘れやすいので、そもそもその構造を避けるのが最善です。

唯一の本物これが役に立つ理由は、構文が異なるBourne のようなシェルと csh のようなシェル (または、rc同様に機能する -like シェル)の両方で動作するコードを記述する場合です。if/then/else

関連情報