如何使用 [] 格式縮短 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返回假。

在您的情況下cmd2( alias) 不太可能返回 false,但在一般情況下很容易忘記該問題,因此最好先避免該構造。

唯一的真實的它可能有用的原因是,當您想要編寫在類似 Bourne 和類似 csh 的 shell(或rc類似的 shell)中工作的程式碼時,其中if/then/else構造具有不同的語法。

相關內容