#1 Le 08/03/2011, à 09:05
- YannUbuntu
Optimisation code bash du Desinstallateur d'OS
Bonjour
J'ai besoin de votre aide pour optimiser le code du Desinstallateur d'OS.
J'ai un fichier de type :
/dev/sda1:Windows Vista (loader):Windows:chain
/dev/sda5:Ubuntu 10.04.1 LTS (10.04):Ubuntu:linux
/dev/sdb10:Ubuntu 10.10 (10.10):Ubuntu:linux
...
et je voudrais, pour chaque ligne, mettre en variable les éléments suivants :
PARTITION[ligne1]="sda1" (apres le dev/ , et avant les deux points )
DISK[ligne1]="sda"
NAME1[ligne1]="Windows Vista (loader):Windows:chain" (tout ce qu'il y a après les deux points)
NAME2[ligne1]="Windows Vista" (avant la première ouverture de parenthèse, mais sans l'espace avant cette parenthèse)
NAME3[ligne1]="Windows" (le 1er mot avant le 1er espace)
Comment feriez-vous cela ?
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#2 Le 08/03/2011, à 09:34
- Hizoka
Re : Optimisation code bash du Desinstallateur d'OS
a="/dev/sda1:Windows Vista (loader):Windows:chain"
PARTITION=${a##*/} PARTITION=${PARTITION%%:*}
DISK=${PARTITION/%[0-9]*}
NAME1=${a#*:} NAME1=${NAME1%%:*}
NAME2=${NAME1% *}
NAME3=${NAME1%% *}
echo "PARTITION : $PARTITION
DISK : $DISK
NAME1 : $NAME1
NAME2 : $NAME2
NAME3 : $NAME3"
=>
PARTITION : sda1
DISK : sda
NAME1 : Windows Vista (loader)
NAME2 : Windows Vista
NAME3 : Windows
si tu utilises un treeview avec glade2script, tu pourras tout séparer également...
Dernière modification par Hizoka (Le 08/03/2011, à 09:38)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 08/03/2011, à 09:43
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
merci et comment fais-tu la boucle pour scanner le fichier ligne par ligne ?
( j'utilise actuellement un for i in fichier , mais ca me prend bout par bout entre les espace, par exemple :
/dev/sda1:Windows ,
puis Vista
puis (loader):Windows:chain
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#4 Le 08/03/2011, à 09:48
- Hizoka
Re : Optimisation code bash du Desinstallateur d'OS
while read ligne
do
....
done < ta_liste
ou
while read ligne
do
....
done < <(ta commande qui renvoie les lignes)
ou encore for avec modif de l'IFS mais bof...
old_IFS=${IFS}
IFS=$'\n'
for i in ....
do
....
done
IFS=${old_IFS}
Dernière modification par Hizoka (Le 08/03/2011, à 09:49)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 08/03/2011, à 12:56
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
Splendide, merci !
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#6 Le 08/03/2011, à 14:11
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
Bingo ! je passe de 40 lignes à 10 lignes de code
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#7 Le 08/03/2011, à 22:04
- Hizoka
Re : Optimisation code bash du Desinstallateur d'OS
d'autres questions ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 09/03/2011, à 02:52
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
oui, mais ca devient du détail :
1) optimiser les codes suivants : (peut-etre avec des <<< ?)
$(sudo blkid | grep -i '="ntfs"' | cut -c6-9)
$(echo $TAB | xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="")
$(dir $TMP_FOLDER/${DISK[$m]} | grep -i "mbr-")
2) Regarder dans le code si je peux retirer des guillemets sans risque, par exemple pour les codes du type :
zenity --info --title="$Operation_aborted"
if [[ "$ADVISE_BOOTLOADER_UPDATE" = "yes" ]]; then
Dernière modification par YannUbuntu (Le 09/03/2011, à 02:53)
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#9 Le 09/03/2011, à 03:26
- Hizoka
Re : Optimisation code bash du Desinstallateur d'OS
$(sudo blkid | grep -i '="ntfs"' | cut -c6-9)
$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
$(echo $TAB | xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="")
$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")
xargs sert à quoi ?
$(dir $TMP_FOLDER/${DISK[$m]} | grep -i "mbr-")
$(ls $TMP_FOLDER/${DISK[$m]}/*mbr-*
zenity --info --title="$Operation_aborted"
Conserve les, ca ne coute rien et ca evite tout probleme
if [[ "$ADVISE_BOOTLOADER_UPDATE" = "yes" ]]; then
if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then
Teste tous les codes 1 à 1...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 09/03/2011, à 03:47
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
-> Trop compliqué pour moi, je ne saurais pas retrouver le sens ..
Pas moyen d'utiliser 2 fois <<< ?
$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")
-> ok, c'est bien ce que je pensais, mais je me demandais s'il fallait mettre des parentheses avant les <<<
Cette construction avec xargs permet de remplir la liste du zenity. Par contre je ne connais pas son fonctionnement interne, j'applique juste la recette.
$(ls $TMP_FOLDER/${DISK[$m]}/*mbr-*
-> je suppose qu'il manque la fermeture de parenthese Pourquoi ls au lieu de dir ?
Conserve les, ca ne coute rien et ca evite tout probleme. -> parce-que dans zenity ? quid d'une structure sans zenity du type :
VARIABLE="$Operation_aborted"
Dans ce cas je peux retirer les guillemets ?
if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then
quelle es la difference entre = et == ? (il me semble avoir deja vu un exemple avec un seul = , et sans guillemets .. )
Dernière modification par YannUbuntu (Le 09/03/2011, à 03:52)
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#11 Le 09/03/2011, à 03:58
- YannUbuntu
Re : Optimisation code bash du Desinstallateur d'OS
ah autre question : comment ouvrir un fichier FILE="/dossier/fichier" et y inserer une ligne de code $CODE="ma ligne de code" a un numero de ligne donné ($NUM_LIGNE) ?
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#12 Le 09/03/2011, à 05:29
- Hizoka
Re : Optimisation code bash du Desinstallateur d'OS
$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
-> Trop compliqué pour moi, je ne saurais pas retrouver le sens ..
Pas moyen d'utiliser 2 fois <<< ?
Non...
-n : n'affichera que les lignes demandées
/="ntfs"/ : recherche les lignes contenant ="ntfs" (équivalent à ton grep)
s : remplace .*/\(.*\): .* par \1
@ : le délimiteur qu'on utilisera pour sed
.*/\(.*\): . : tout jusqu'au /, conserve en mémoire ce qui suit jusqu'à ": "
:\1 :ce que tu gardé en mémoire (le \(.*\))
p : affiche le retour de ma recherche et modification.
$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")
et sans le xargs ça passe pas ?
$(ls $TMP_FOLDER/${DISK[$m]}/*mbr-*
-> je suppose qu'il manque la fermeture de parenthese Pourquoi ls au lieu de dir ?
en effet il manque la parenthèse. j'utilise ls afin de ne pas utiliser de | et donc optimiser le code.
Conserve les, ca ne coute rien et ca evite tout probleme. -> parce-que dans zenity ?
Tu as besoin des " ou ' si tu as un texte à espace.
quid d'une structure sans zenity du type :
VARIABLE="$Operation_aborted"
Dans ce cas je peux retirer les guillemets ?
a="j'aime le gros rouge qui pique"
echo ${a}
=> j'aime le gros rouge qui pique
zenity --info --title=$a
=> zenity --info --title=j'aime le gros rouge qui pique
conclusion...ca passe pas...
il te faut l'encadrer de "
if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then
quelle es la difference entre = et == ? (il me semble avoir deja vu un exemple avec un seul = , et sans guillemets .. )
tu n'as pas du lire : http://abs.traduc.org/abs-fr/ch07s03.html
ah autre question : comment ouvrir un fichier FILE="/dossier/fichier" et y inserer une ligne de code $CODE="ma ligne de code" a un numero de ligne donné ($NUM_LIGNE) ?
echo "a : 1
b : 2
d : 4
e : 5" > test
sed -i "2ac : 3" test
cat test
=> a : 1
b : 2
c : 3
d : 4
e : 5
rm test
-i : modifie directement le fichier
2 : ligne numero 2
a : ajoute apres la ligne 2
c : 3 : texte à ajouter
test : nom du fichier
donc la réponse à ta question :
sed -i "${NUM_LIGNE}a${CODE}" "${FILE}"
Répétition de conseil : encadre tes variables par des accolades...
Dernière modification par Hizoka (Le 09/03/2011, à 05:30)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne