我想將其縮短為一行:
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
返回假。
在您的情況下cmd2
( alias
) 不太可能返回 false,但在一般情況下很容易忘記該問題,因此最好先避免該構造。
唯一的真實的它可能有用的原因是,當您想要編寫在類似 Bourne 和類似 csh 的 shell(或rc
類似的 shell)中工作的程式碼時,其中if/then/else
構造具有不同的語法。