1) eles estão fora de ordem porque você perguntou: você prepara toda a lista e então | sort
deles.
2) o teste deve ser (padrão sh
sintaxe): if [ "$variable" = ...
(não ==
).
3) para testar coisas, use sh -xv
, que imprimirá todas as linhas antes de executá-las e o resultado das expansões.
4) por que você foge dos backticks?
5) Você perdeu aspas em torno de suas variáveis
6) < $@
só funciona se houver apenas um argumento para o script.
7) usando read
sem -r
e sem remover os caracteres de espaço em branco de $IFS
provavelmente não faz sentido aqui.
8) você não pode usar echo
com dados arbitrários
9) Deve ser #!/bin/sh
, não #!bin/sh
Script de trabalho:
#!/bin/sh
oldstr="abc"
while IFS= read -r line
do
newstr='printf '%s\n' "$line" | sed 's/\(.*\)\( \)\([0-9].*\)//''
printf '%s\n' "$oldstr vs $newstr"
if [ "$oldstr" = "$newstr" ]
then
echo "old $oldstr"
else
oldstr=$newstr
printf '%s\n' "new $oldstr"
fi
done < "$1"
echo "done"
Além disso, você deve alterar o arquivo de teste de entrada. O que você postou nunca aciona o caso "antigo".
Se você quiser classificar o arquivo antes de passá-lo para o loop, altere a linha while
para:
sort -- "$@" | while IFS= read -r line
e, obviamente, remova o < $@
após done
:
sort -- "$@" | while IFS= read -r line
do
[...]
done