É estranho que você esteja usando sudo para alterar as permissões no arquivo, mesmo que ele esteja em seu diretório pessoal. O arquivo pertence a você? chmod u+w apenas concede permissão de gravação ao proprietário do arquivo. Se você é o dono, não precisa de sudo. Se você não for o proprietário, precisará de sudo , mas chmod u+w apenas concederá permissão de gravação ao proprietário, não lhe concedendo permissão para gravar no arquivo. Então, depois de executar chmod u+w , o arquivo ainda não pode ser gravado por você, que é o que [ -w … ] testa.
Execute ls -l ~/scripts/text.txt para verificar a propriedade e as permissões no arquivo.
Além disso, sempre coloque aspas duplas em torno das substituições de variáveis. (Ou você pode aprender todas as regras e criar seu script Difícil de manter por pessoas que não conhecem todas as regras.) Irritantemente, $file na sintaxe da shell não significa “pegar o valor da variável file ”, isso significa “pegar o valor da variável file , analise-a como uma lista de padrões de curingas e substitua cada padrão pela lista de arquivos correspondentes, se houver arquivos correspondentes ”. Esse material extra é desativado se a substituição ocorrer entre aspas duplas: "$file" significa "pegue o valor da variável file ".
Além disso, você não precisa de todas essas chaves.
if [ ! -w "$file" ]
then
sudo chmod u+w "$file" && echo "The file is now writable"
elif [ -w "$file" ]
then
echo "The file is already writable"
fi
Como [ -w "$file" ] é a negação de [ ! -w "$file" ] , o teste elif será sempre bem-sucedido se for atingido. (A menos que haja uma condição de corrida, caso em que o teste elif que testa a mesma condição novamente pode retornar um resultado diferente, o que é ruim.) Assim, você pode e deve simplificar isso para
if [ ! -w "$file" ]
then
sudo chmod u+w "$file" && echo "The file is now writable"
else
echo "The file is already writable"
fi