Você pode encadear apenas && , não é necessário aninhar condicionais aqui:
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
funciona.
No meu arquivo .bashrc eu tenho:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then . /etc/bash_completion; fi
Eu queria usar [] em vez de if then fi
Eu já tenho
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ "${BASH_VERSINFO[0]}" -ge 4 ] && shopt -s autocd
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
então pensei que talvez pudesse usar
[ [ -f /etc/bash_completion ] && [! shopt -oq posix] ] && . /etc/bash_completion
mas eu recebo
-bash: [: -f: binary operator expected
Você confunde dois comandos. [ não é equivalente a if . [ é equivalente a test .
if não é nem um comando simples, mas uma palavra reservada (como [[ ), parte de uma estrutura de controle. if ... then ... else ... fi é quase equivalente a ... && { ...; true; } || { ... }