aide correction script bash - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 25-11-2003 à 09:44:18
Hum, bizarre, c'est moi le script passe nickel.
T'es sous quoi ??
Marsh Posté le 25-11-2003 à 09:46:20
nan tu te fous de ma gueule, chez toi ça passe ?
Marsh Posté le 25-11-2003 à 09:46:32
ben tu dois avoir un guillement non-fermé ...
je viens de faire un copier-coller sous emacs, et je vois tout de suite l'erreur !!!
#prend le premier element
PREC=`echo $TOTO|awk '{print $1}'
il manque un ` à la fin de cette ligne
Marsh Posté le 25-11-2003 à 09:49:34
farib a écrit : nan tu te fous de ma gueule, chez toi ça passe ? |
Ah bien j'ai pris que les 12 dernieres lignes donc c'est normal que ca passe
Sinon oui il manque un `
Marsh Posté le 25-11-2003 à 10:06:47
Heuu juste comme ça en passant, tu as pas mal d'erreur dans ton script
qualques pistes :
- tu incrémentes jamais i, ça boucle à l'infini -> man expr
- la variable i n'est pas la même que I
- awk '{print $$I}' : apparemment, tu veux que awk interprete print ${la valeur de I}, dans ce cas, il faut évaluer $I, il faut donc fermer et réouvrir tes quotes, ça donne : awk '{print $'$I'}'
bon courage
Marsh Posté le 25-11-2003 à 10:14:54
corrigé ( je vais y arriver, je vais y arriver...)
bon zut I=$I+1 ça marche pas comme ça, faut que je fasse évaluer la valeur numérique
Marsh Posté le 25-11-2003 à 10:43:16
arf, je vais assayer d'insérer des guillements pour pas que awk se rate avec les noms de fichiers avec espaces
TOTO=`ls -l $1| grep -vE ^[dl]| sort -nk 5 | awk '{print $8}' | sed s/\(.*\)/\\"$1\\"/g` |
Marsh Posté le 25-11-2003 à 11:01:29
Oula ya des erreurs partout.
Une variable contenant un nom de fichier en bash doit toujours être protégé avec des guillemets (même avec ça, on a des problèmes si le nom de fichier contient des sauts de lignes...).
Mon avis est que ce script est inutilement compliqué et serait plus simple à écrire en perl ou en awk. Admettons que tu fasses ça pour t'amuser. Je te conseille tout de même de le faire en perl après
Pour sélectionner un fichier dans ta liste, utilise sed :
echo "$TOTO" | sed -ne ${I}p
(en bash tu as des tableaux mais en sh je ne suis pas sur)
De plus ton algo ne fonctionne pas : tu peux avoir 3 fichiers A, B et C de taille identique avec A=C. Tu ne testes ici que A!=B et B!=C...
Il faut comparer deux à deux les fichiers de taille identique.
Fais des fonctions shell pour plus de clareté dans ton code, ça va devenir compliqué
Marsh Posté le 25-11-2003 à 11:05:30
farib a écrit : arf, je vais assayer d'insérer des guillements pour pas que awk se rate avec les noms de fichiers avec espaces |
Mauvaise idée, si tu veux protéger un nom de fichier, il faut plutôt échapper tous les caractères. Si tu as des guillemets dans ton nom de fichier, ça va poser pb (nb : ça ne résoud toujours pas le problème des saut de lignes ici).
Code :
|
Marsh Posté le 25-11-2003 à 09:20:27
voila, je dois toujours faire un script qui 'donne les fichiers en double du répertoire courant' en bash, pour apprendre, même si des utilitaires C existent
donc la j'ai pondu un "script" qui d'arès moi devrait marcher, d'apres les morceaux d'élements que j'ai réussi a chopper par ci par la, mais évidemment ça marche pas donc si vous pouviez m'aider...
(oui c pas élégant mais j'en suis au stade de l'apprentissage)
donc je liste les fichiers du répertoire, les trie par ordre de taille, et les teste 2 à 2 avec diff ( complexité linéaire)
#!/bin/bash
#cree une liste des fichiers triee par odre de taille
TOTO=`ls -l $1| grep -vE ^d | sort -nk 5 | awk '{print $8}'`
#donne le nombre d'elements ( de fichiers)
NB_FICHIERS=`echo $TOTO | wc -w`
#prend le premier element
PREC=`echo $TOTO|awk '{print $1}'`
#initialise la boucle
I=2
#on boucle tant qu'on a pas teste le dernier fichier
until test $I -ge $NB_FICHIERS
do
#on selectionne le i-ème fichier
FICHIER_COURANT=`echo $TOTO|awk '{print $'$I'}'`
#si les fichiers sont identiques ( diff ne retourne rien)
if test -z `diff $PREC $FICHIER_COURANT`
then
echo "les fichiers $PREC et $FICHIER_COURANT sont identiques"
fi
PREC=$FICHIER_COURANT
I=`expr $I + 1`
done
j'ai corrigé 2-3 errerus de syntaxe et betes, mais j'ai une erreur ./dascript: line 16: test: -ge: unary operator expected que je ne comprend pas
Message édité par farib le 25-11-2003 à 10:30:32
---------------
Bitcoin, Magical Thinking, and Political Ideology