WHICH="'which which'" é exatamente equivalente a WHICH='which which' ou WHICH=$(which which) ou WHICH="$(which which)" . Todos eles executam o comando which which e capturam sua saída (como uma string) na variável WHICH , removendo qualquer nova linha final da saída. Da mesma forma, AWK="'${WHICH} gawk'" pode ser escrito AWK='$WHICH gawk' .
Normalmente, as substituições de comandos ( 'command' ou $(command) ) devem ser colocadas entre aspas duplas, caso o resultado contenha curingas de espaços em branco ou de concha ( *?[\ ). Isso ocorre porque o resultado de substituições de comandos, como substituições de variáveis ( $foo ou ${foo} ), sofre divisão de palavras e geração de nome de arquivo (também conhecido como globbing). No entanto, isso não se aplica a atribuições de variáveis simples: como o contexto requer uma única palavra, o resultado da substituição é considerado como está. Portanto, as atribuições são uma exceção à regra geral de que você deve duplicar as substituições de comando e variável. (Observe que essa exceção não se estende a export var="$value" , que exige as aspas duplas.) Mas é uma prática razoável de programação shell sempre as aspas duplas - omitir elas somente se você sabe que deve, em vez de usá-las apenas se sei que você deve.
No (improvável) caso which which retorna um caminho com espaços ou curingas, ${WHICH} deve ser colocado entre aspas nas linhas abaixo, ou seja, um dos
AWK="'"${WHICH}" gawk'"
AWK='"${WHICH}" gawk'
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)
(Usar $(…) é recomendado acima de '…' , devido à dificuldade de obter as citações aninhadas dentro de '…' . No entanto, shells muito antigas não reconhecem $(…) , então '…' é necessário para scripts que deve ser executado em sistemas mais antigos.)
Veja também $ VAR vs $ { VAR} e para citar ou não citar