Isso é um problema:
if [ 'grep vm.swappiness /etc/sysctl.conf' != "vm.swappiness=5" ]; then
Como se grep
não encontrar nada, ele não produzirá nada, e o lado esquerdo disso não será nada, o que é um erro. Também é um problema se encontrar algo, pois a saída pode conter espaço em branco (por exemplo, se vm.swappiness
estiver no arquivo várias vezes). Isso precisa ser citado ou aparecerá como uma série de strings distintas quando expandido.
Portanto, você deve usar if [ "$(grep ...)" ]
para que a saída seja citada. Se não houver saída, você terá ""
, o que é bom em ambos os lados de um teste no bash.
No entanto, neste caso, recomendo usar o status de saída do grep. De man grep
:
EXIT STATUS
Normally, the exit status is 0 if selected lines are found and 1 otherwise. But the exit status is 2 if an error occurred...
Também é útil aqui a opção -q
:
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected.
Portanto, tenha em mente que $?
é o status de saída do último processo de primeiro plano concluído:
grep -q grep vm.vfs_cache_pressure /etc/sysctl.conf
if [ $? -eq 1 ]; then
Esta condição será verdadeira se grep
não encontrar nada e nenhum erro ocorrer.