Claro, você pode armazenar as opções para passar uma variável. Seu primeiro exemplo poderia ser algo assim (também, [[
é um recurso bash, não disponível no shell POSIX):
if [[ $a == "y" ]] ; then
arg=1
elif [[ $a == "n" ]] ; then
arg=2
else
arg=3
fi
command --option "$arg" argument
Seu segundo exemplo:
if [[ $b != "n" ]] ; then
extra="; command2 --option argument"
fi
find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument$extra
# if unset, $extra will be empty—you can of course explicitly
# set it to '' if this bothers you.
Eles funcionam devido à forma como a expansão de variáveis funciona: ela é substituída pela linha de comando, depois (se não for citada) dividida em palavras e, em seguida, passada para o comando. Assim, o comando chamado não conhece as variáveis, o shell as expandiu antes de chamá-lo.
Como você está usando o bash, também é possível usar matrizes:
args=()
if [ -n "$OPT_LONG" ]; then
args+=(-l)
fi
if [ -n "$OPT_SORT_TIME" ]; then
args+=(-t)
fi
ls "${args[@]}"
O recurso de matriz permite que você crie facilmente listas de argumentos arbitrariamente longas sem se preocupar com a divisão de palavras quebrando seu código.