#1 Le 30/10/2016, à 19:10
- MineElectricity
Mon scrit bash est-il clair ?
Bonjour,
Pour m'initier au bash je me suis donné comme "défis" de créer un fichier post-install d'ubuntu 16.04.
Après toutes mes péripéties et oublis d’espaces (merci à https://doc.ubuntu-fr.org/tutoriel/script_shell ) je me demande donc si il est clair
Ce serait donc un honneur qu'un cousin "barbus" puisse me donner son avis ! :3
#!/bin/bash
#2016/10/30 on ubuntu 16.04
#je travaille pour faire un deuxième script entièrement automatisé
#ce script demande en premier quelles actions appliquer puis les appliques, pour comprendre les liens la demande est au même nombre de tabulation que l'action plus basse.
#ce script à pour but de compléter l'installation d'ubuntu 16.04
#demande à l'user si il veut continuer et explique y et n
echo "Script lancé, pour vérifier si des erreurs ont lieux lire le terminal
"
echo "Répondre Y ou N aux actions à appliquer, si vous répondez autre chose(sauf si l'on demande d'écrire des paquets), faites ctrl+c et relancez le script
"
echo -n "vlc, zram et le francais seront installés mais les suggestions d'achat d'ubuntu supprimées continuer ?"
read reponse
if [ "$reponse" = "y" ] || [ "$reponse" = "Y" ]; then
echo "Le script continue."
echo -n "Mettre à jour le système + noyau ?"
read maj
echo -n "Installer java libre et son greffon firefox ?"
read java
echo -n "Installer la prise en charge dvd ?"
read dvd
echo -n "Activer le clavier numérique au démarrage ?"
read numpad
echo -n "Désactiver le bluetooth au démarrage ?"
read bluetooth
echo 'Voici des programmes, merci d'"'"'écrire éxactement ceux que vous voulez de cette manière;"firefox thunderbird [...]"'
echo -n "À moins que vous vouliez automatiser cette étape ? (utilisateur moyen)"
read auto2
echo "Votre réponse est enregistrée si vous avez dit Y n'écrivez rien au prochain ':'
"
echo "Voici quelques exemples de programmes utiles:filezilla skype openssh-server sshfs inkscape gimp gthumb shotwell sweethome3d cheese vokoscreen kazam pavucontrol gnome-alsamixer paman pavumeter padevchooser paprefs ubuntu-restricted-extras ffmpeg gstreamer0.10-plugins-ugly gxine libdvdread4 totem-mozilla icedax tagtool easytag id3tool lame nautilus-script-audio-convert libavcodec-extra keepassx shutter xournal gufw ppa-purge synaptic gksu gdebi numlockx geany smartmontools geany-plugins gedit-plugins gconf-editor unity-tweak-tool clamav clamtk bleachbit sysinfo hardinfo docky cairo-dock brasero grsync gnome-shell gnome-shell-extensions kde lxde xfce mate cinnamon
"
echo "Je recommande d'intaller:skype gimp cheese unity-tweak-tool audacity blender gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen
"
echo -n "Écrivez les programmes:"
read paquets
echo -n "Installer prelink ?"
read prelink
echo -n 'Éffectuer "update upgrade autoremove autoclean" à la fin du script ?'
read majend
#maj + noyau + clean
if [ "$maj" = "y" ] || [ "$maj" = "Y" ]; then
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y
echo "maj ok"
fi
#installtion de java
if [ "$java" = "y" ] || [ "$java" = "Y" ]; then
apt-get install -y default-jre icedtea-plugin
echo "java libre ok"
fi
#prise en charge dvd
if [ "$dvd" = "y" ] || [ "$dvd" = "Y" ]; then
apt-get install -y libdvd-pkg && dpkg-reconfigure libdvd-pkg
echo "dvd ok"
fi
#numpad on au boot
if [ "$numpad" = "y" ] || [ "$numpad" = "Y" ]; then
sed -i 's|^exit 0.*$|# Numlock enable\n[ -x /usr/bin/numlockx ] \&\& numlockx on\n\nexit 0|' /etc/rc.local
echo "clavier numérique au démrrage ok"
fi
#install des paquets recommandés
if [ "$auto2" = "y" ] || [ "$auto2" = "Y" ]; then
apt-get install -y audacity blender gimp gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen skype cheese unity-tweak-tool
echo "programmes auto installés"
fi
#install des paquets choisis
apt-get install -y "$paquets"
echo "programmes ""$paquets""installés"
#install de prelink
if [ "$prelink" = "y" ] || [ "$prelink" = "Y" ]; then
apt-get -y install prelink && sed -i 's/PRELINKING=unknown/PRELINKING=yes/' /etc/default/prelink && /etc/cron.daily/prelink &&
echo 'DPkg::Post-Invoke {"echo Pré-raccordement des bibliothèques en cours, veuillez patienter...;/etc/cron.daily/prelink";}'| tee -a /etc/apt/apt.conf.d/98prelink
echo "prelink installé"
fi
#Désactivation du bluetooth au boot
if [ "$bluetooth" = "y" ] || [ "$bluetooth" = "Y" ]; then
sed -i 's|^exit 0.*$|# Bluetooth disabled\nrfkill block bluetooth\n\nexit 0|' /etc/rc.local
echo 'Bluetooth auto off'
fi
#installation des paquets demandés en premier + francais et suppression des propositions d'achats
apt-get install -y zram-config language-pack-fr language-pack-fr-base language-pack-gnome-fr language-pack-gnome-fr-base vlc
command gsettings set com.canonical.Unity.Lenses disabled-scopes "['more_suggestions-amazon.scope', 'more_suggestions-u1ms.scope', 'more_suggestions-populartracks.scope', 'music-musicstore.scope', 'more_suggestions-ebay.scope', 'more_suggestions-ubuntushop.scope', 'more_suggestions-skimlinks.scope']"
command gsettings set 'com.canonical.Unity.ApplicationsLens' 'display-available-apps' 'false'
echo "zram + francais + suggestion d'achat ok"
if [ "$majend" = "y" ] || [ "$majend" = "Y" ]; then
apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get autoclean -y
fi
#si la personne à dit n/N à la toute première question
elif [ "$reponse" = "n" ] || [ "$reponse" = "N" ]; then
echo "byeeeee"
#si la personne à mal répondu à la première question
else
echo "Il faut taper Y ou y ou N ou n ! Pas $reponse"
fi
echo "script terminé, pour vérifier si des erreurs ont eu lieux lire le terminal"
exit 0;
Hors ligne
#2 Le 30/10/2016, à 19:25
- MineElectricity
Re : Mon scrit bash est-il clair ?
je viens de me rendre compte que certainnes actions n'étaient pas dans le même ordre que les question les voicis donc rétablies
#!/bin/bash
#2016/10/30 on ubuntu 16.04
#je travaille pour faire un deuxième script entièrement automatisé
#ce script demande en premier quelles actions appliquer puis les appliques, pour comprendre les liens la demande est au même nombre de tabulation que l'action plus basse.
#ce script à pour but de compléter l'installation d'ubuntu 16.04
#demande à l'user si il veut continuer et explique y et n
echo "Script lancé, pour vérifier si des erreurs ont lieux lire le terminal
"
echo "Répondre Y ou N aux actions à appliquer, si vous répondez autre chose(sauf si l'on demande d'écrire des paquets), faites ctrl+c et relancez le script
"
echo -n "vlc, zram et le francais seront installés mais les suggestions d'achat d'ubuntu supprimées continuer ?"
read reponse
if [ "$reponse" = "y" ] || [ "$reponse" = "Y" ]; then
echo "Le script continue."
echo -n "Mettre à jour le système + noyau ?"
read maj
echo -n "Installer java libre et son greffon firefox ?"
read java
echo -n "Installer la prise en charge dvd ?"
read dvd
echo -n "Activer le clavier numérique au démarrage ?"
read numpad
echo -n "Désactiver le bluetooth au démarrage ?"
read bluetooth
echo 'Voici des programmes, merci d'"'"'écrire éxactement ceux que vous voulez de cette manière;"firefox thunderbird [...]"'
echo -n "À moins que vous vouliez automatiser cette étape ? (utilisateur moyen)"
read auto2
echo "Votre réponse est enregistrée si vous avez dit Y n'écrivez rien au prochain ':'
"
echo "Voici quelques exemples de programmes utiles:filezilla skype openssh-server sshfs inkscape gimp gthumb shotwell sweethome3d cheese vokoscreen kazam pavucontrol gnome-alsamixer paman pavumeter padevchooser paprefs ubuntu-restricted-extras ffmpeg gstreamer0.10-plugins-ugly gxine libdvdread4 totem-mozilla icedax tagtool easytag id3tool lame nautilus-script-audio-convert libavcodec-extra keepassx shutter xournal gufw ppa-purge synaptic gksu gdebi numlockx geany smartmontools geany-plugins gedit-plugins gconf-editor unity-tweak-tool clamav clamtk bleachbit sysinfo hardinfo docky cairo-dock brasero grsync gnome-shell gnome-shell-extensions kde lxde xfce mate cinnamon
"
echo "Je recommande d'intaller:skype gimp cheese unity-tweak-tool audacity blender gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen
"
echo -n "Écrivez les programmes:"
read paquets
echo -n "Installer prelink ?"
read prelink
echo -n 'Éffectuer "update upgrade autoremove autoclean" à la fin du script ?'
read majend
#maj + noyau + clean
if [ "$maj" = "y" ] || [ "$maj" = "Y" ]; then
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y
echo "maj ok"
fi
#installtion de java
if [ "$java" = "y" ] || [ "$java" = "Y" ]; then
apt-get install -y default-jre icedtea-plugin
echo "java libre ok"
fi
#prise en charge dvd
if [ "$dvd" = "y" ] || [ "$dvd" = "Y" ]; then
apt-get install -y libdvd-pkg && dpkg-reconfigure libdvd-pkg
echo "dvd ok"
fi
#numpad on au boot
if [ "$numpad" = "y" ] || [ "$numpad" = "Y" ]; then
sed -i 's|^exit 0.*$|# Numlock enable\n[ -x /usr/bin/numlockx ] \&\& numlockx on\n\nexit 0|' /etc/rc.local
echo "clavier numérique au démrrage ok"
fi
#Désactivation du bluetooth au boot
if [ "$bluetooth" = "y" ] || [ "$bluetooth" = "Y" ]; then
sed -i 's|^exit 0.*$|# Bluetooth disabled\nrfkill block bluetooth\n\nexit 0|' /etc/rc.local
echo 'Bluetooth auto off'
fi
#install des paquets recommandés
if [ "$auto2" = "y" ] || [ "$auto2" = "Y" ]; then
apt-get install -y audacity blender gimp gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen skype cheese unity-tweak-tool
echo "programmes auto installés"
fi
#install des paquets choisis
apt-get install -y "$paquets"
echo "programmes ""$paquets""installés"
#install de prelink
if [ "$prelink" = "y" ] || [ "$prelink" = "Y" ]; then
apt-get -y install prelink && sed -i 's/PRELINKING=unknown/PRELINKING=yes/' /etc/default/prelink && /etc/cron.daily/prelink &&
echo 'DPkg::Post-Invoke {"echo Pré-raccordement des bibliothèques en cours, veuillez patienter...;/etc/cron.daily/prelink";}'| tee -a /etc/apt/apt.conf.d/98prelink
echo "prelink installé"
fi
#installation des paquets demandés en premier + francais et suppression des propositions d'achats
apt-get install -y zram-config language-pack-fr language-pack-fr-base language-pack-gnome-fr language-pack-gnome-fr-base vlc
command gsettings set com.canonical.Unity.Lenses disabled-scopes "['more_suggestions-amazon.scope', 'more_suggestions-u1ms.scope', 'more_suggestions-populartracks.scope', 'music-musicstore.scope', 'more_suggestions-ebay.scope', 'more_suggestions-ubuntushop.scope', 'more_suggestions-skimlinks.scope']"
command gsettings set 'com.canonical.Unity.ApplicationsLens' 'display-available-apps' 'false'
echo "zram + francais + suggestion d'achat ok"
#maj et clean du système avant de quitter
if [ "$majend" = "y" ] || [ "$majend" = "Y" ]; then
apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get autoclean -y
fi
#si la personne à dit n/N à la toute première question
elif [ "$reponse" = "n" ] || [ "$reponse" = "N" ]; then
echo "script annulé"
#si la personne à mal répondu à la première question
else
echo "Il faut taper Y ou y ou N ou n ! Pas $reponse"
fi
echo "script terminé, pour vérifier si des erreurs ont eu lieux lire le terminal"
exit 0;
Hors ligne
#3 Le 31/10/2016, à 08:48
- Hizoka
Re : Mon scrit bash est-il clair ?
Salut voici un petit retour perso
if [ "$reponse" = "y" ] || [ "$reponse" = "Y" ]; then
=>
if [[ "${REPLY,,}" == "y" ]]; then
en utilisant les doubles virgules, ça me la variable en minuscule.
echo -n "Mettre à jour le système + noyau ?"
read maj
echo -n "Installer java libre et son greffon firefox ?"
read java
pas logique d'ajouter des tabulations, c'est au même niveau tous ces echo et read.
echo 'Voici des programmes, merci d'"'"'écrire éxactement ceux que vous voulez de cette manière;"firefox thunderbird [...]"'
=>
echo "Voici des programmes, merci d'écrire éxactement ceux que vous voulez de cette manière;\"firefox thunderbird [...]\""
Je trouve ça plus lisible
echo "Votre réponse est enregistrée si vous avez dit Y n'écrivez rien au prochain ':'
=> pourquoi ne pas utiliser un if qui teste directement cette possibilité pour eviter d'afficher le texte ?
echo "Votre réponse est enregistrée si vous avez dit Y n'écrivez rien au prochain ':'
"
=>
echo -e "Votre réponse est enregistrée si vous avez dit Y n'écrivez rien au prochain ':'\n"
je trouve ca plus lisible mais bon
if [ "$maj" = "y" ] || [ "$maj" = "Y" ]; then
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y
echo "maj ok"
fi
#installtion de java
if [ "$java" = "y" ] || [ "$java" = "Y" ]; then
apt-get install -y default-jre icedtea-plugin
echo "java libre ok"
fi
pas logique d'ajouter des tabulations, c'est au même niveau tous ces if.
Mais leur contenu peut etre indenter lui.
et tu peux reutiliser les ${VARIABLES,,} pour eviter les doubles verifications.
et pour
if [ "$reponse" = "y" ] || [ "$reponse" = "Y" ]; then
...
#si la personne à dit n/N à la toute première question
elif [ "$reponse" = "n" ] || [ "$reponse" = "N" ]; then
echo "script annulé"
#si la personne à mal répondu à la première question
else
echo "Il faut taper Y ou y ou N ou n ! Pas $reponse"
fi
=>
case "${reponse}" in
y*|o*) suite du script ;;
n*) echo "script annulé" ;;
*) echo "Il faut taper Y ou y ou N ou n ! Pas $reponse" ;;
esac
plus lisible mais surtout test si on a repondu yes ou oui aussi bien que y ou o.
Perso je suis pas fan de toutes ces questions...
je te joins un script perso :
function multiselect
{
# valeur de retour numérique : ${multinum[@]}
# valeur de retour de texte : ${multitxt[@]}
# ${@} : les arguments servant de liste
# PS3 : message à afficher avant le listing
# @@ : élément séparateur, partie de gauche valeur texte et à gauche description ( valeur@@description )
# argument : -[0-9] : limite le nombre de reponse possible
# ATTENTION : La liste commence au chiffre 1 mais les tableaux retournés commencent, eux, à 0 (comme tout tableau)
# Remise au propre des variables
unset multinum multitxt limite num x
# Recherche l'option du nombre de reponse
[[ "${1}" == -[0-9]* ]] && limite="${1/#-}"
# Message informatif apparaissant avant la liste
if [[ ${PS3} && ${limite} ]]
then
if [[ ${limite} = 1 ]]
then
echo -e "${FUSHIA}${PS3}${RAZ} ( ${BLEUFONCE}1 seul choix possible.${RAZ} )\n"
else
echo -e "${FUSHIA}${PS3}${RAZ} ( ${BLEUFONCE}${limite} choix possibles.${RAZ} )\n"
fi
elif [[ ${PS3} && -z ${limite} ]]
then
echo -e "${FUSHIA}${PS3}${RAZ}\n"
else
echo
fi
# Affichage de la liste des choix
for x in "${@}"
do
# En cas de limite, on saute la 1ere valeure qui est le chiffre donné
if [[ ${limite} && -z ${num} ]]
then
num=0
else
# Incrémentation du numéro pour la prochaine ligne
((num++))
# recherche le signe servant de séparateur entre la valeur et la description
if [[ "${x}" =~ "@@" ]]
then
# Si séparateur présent : affichage du numéro, de la valeur du texte et de la description
echo -e "${FUSHIA}${num}${RAZ}) ${BLEUFONCE}${x%%@@*}${RAZ} : ${VERT}${x##*@@}${RAZ}"
else
# Si pas de séparateur : affichage du numéro et de la valeur du texte
echo -e "${FUSHIA}${num}${RAZ}) ${BLEUFONCE}${x}${RAZ}"
fi
fi
done
# Envoie de la réponse dans un tableau
read -p $'\nSélection : ' -a multinum
# Création d'une liste contenant les valeurs textes choisies + Vérification des valeurs numériques
for x in "${multinum[@]}"
do
if [[ ${x} -gt ${#@} || ! ${x} =~ ^[0-9]*$ ]]
then
# Message d'erreur indiquant une réponse impossible
echo -e "\n${ROUGE}Erreur dans la sélection, vous devez rentrez des chiffres inférieurs à la valeur maximale proposée.${RAZ}"
# Destruction des variables
unset multinum multitxt limite
# Arrêt de la fonction en erreur (code 1)
return 1
elif [[ ${limite} && ${#multinum[@]} -gt ${limite} ]]
then
# Message d'erreur indiquant un nombre de reponse trop élevé
echo -e "\n${ROUGE}Nombre de séléction trop importante, la limite est de ${limite} choix.${RAZ}"
# Destruction des variables
unset multinum multitxt limite
# Arrêt de la fonction en erreur (code 1)
return 1
else
# Si il y a eu un argument pour militer le nombre de reponse, on ajoute 1 a x
[[ "${1}" == -[0-9]* ]] && ((x++))
# Ajout de la valeur traitée dans le tableau
multitxt+=("${!x%%@@*}")
fi
done
}
PS3="Liste de question" multiselect "Update@@@Mettre à jour le système + noyau" "Firefox@@@Installer java libre et son greffon firefox" "Installer la prise en charge dvd" "Activer le clavier numérique au démarrage" "Exit"
# Faire sa selection en indiquant les numeros avec des espaces entre eux
echo "${multitxt[@]}"
echo "${multinum[@]}"
Ca met un peu de couleur et ca permet de faire des selections de groupes pour repondre oui au non.
Voila mon avis et ma facon de faire, amuse toi bien pour la suite
Dernière modification par Hizoka (Le 31/10/2016, à 08:49)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 31/10/2016, à 13:07
- MineElectricity
Re : Mon scrit bash est-il clair ?
Merci de ta réponse;
Je vais essayer d'appliquer ce que tu me dit mais étant débutant des phrases comme "[[ "${1}" == -[0-9]* ]] && limite="${1/#-}"" font un peut bizarre.
Pour les tabulations justement je savait pas trop ou les mettre et le problème est que si je les enlèves cela devient un peut chaud à lire
Je vais tester ton script voir ce que ça donne et essayer de comprendre toutes ça partie par partie mais le man https://doc.ubuntu-fr.org/tutoriel/script_shell est-il vraiment complet ?
Merci :3
edit: je suis pas doué en débug, ne comprennant pas encore je sait pas ce que je dois faire après :
sauvegarde/modèle de tableau.sh: 1: /sauvegarde/modèle de tableau.sh: function: not found
sauvegarde/modèle de tableau.sh: 94: /sauvegarde/modèle de tableau.sh: Syntax error: word unexpected (expecting ")")
Dernière modification par MineElectricity (Le 31/10/2016, à 13:14)
Hors ligne
#5 Le 31/10/2016, à 17:18
- Hizoka
Re : Mon scrit bash est-il clair ?
Pour apprendre : http://abs.traduc.org/abs-fr
Les tabulations ne sont pas obligatoires dans un script bash mais aident grandement à lire.
On ajoute une tabulation lorsque l'on rajoute un niveau, ex :
var1="oui"
var2="non"
echo "blabla"
echo "blibli"
if [[ ${var1} == "oui" ]]
then
if [[ ${var2} == "non" ]]
then
echo "oui puis non"
else
echo "oui puis oui"
fi
else
if [[ ${var2} == "non" ]]
then
echo "non puis non"
else
echo "non puis oui"
fi
fi
je t'ai donné une fonction qui te permet de te faire un multichoix tout beau, tout propre.
Tu colles la fonction
function multiselect
{
...
}
dans ton code et tu l’appelles via la commande multiselect.
Mon code est assez détaillé, donc n’hésite pas à lire et à tester.
[[ "${1}" == -[0-9]* ]] && limite="${1/#-}"
peut également s’écrire plus longuement :
if [[ "${1}" == -[0-9]* ]]
then
limite="${1/#-}"
fi
${1} est le 1er argument donné à la fonction
ex :
multiselect -2 "test1" "test2" "test3"
le 1er argument donné est -2.
La commande regarde si le 1er argument est composé d'un - suivi d'un chiffre entre 1 et 9.
Si c'est le cas il récupère la valeur indiqué pour limiter le nombre de réponse possible (dans l'exemple ci dessus, on limite à 2 choix max).
petit exemple visuel : https://asciinema.org/a/cn7ndgyg3111gyqv03oukolt9
Pour bien tester colle ça dans un fichier vierge :
#!/bin/bash
function multiselect
{
# valeur de retour numérique : ${multinum[@]}
# valeur de retour de texte : ${multitxt[@]}
# ${@} : les arguments servant de liste
# PS3 : message à afficher avant le listing
# @@ : élément séparateur, partie de gauche valeur texte et à gauche description ( valeur@@description )
# argument : -[0-9] : limite le nombre de reponse possible
# ATTENTION : La liste commence au chiffre 1 mais les tableaux retournés commencent, eux, à 0 (comme tout tableau)
# Remise au propre des variables
unset multinum multitxt limite num x
# Recherche l'option du nombre de reponse
[[ "${1}" == -[0-9]* ]] && limite="${1/#-}"
# Message informatif apparaissant avant la liste
if [[ ${PS3} && ${limite} ]]
then
if [[ ${limite} = 1 ]]
then
echo -e "${FUSHIA}${PS3}${RAZ} ( ${BLEUFONCE}1 seul choix possible.${RAZ} )\n"
else
echo -e "${FUSHIA}${PS3}${RAZ} ( ${BLEUFONCE}${limite} choix possibles.${RAZ} )\n"
fi
elif [[ ${PS3} && -z ${limite} ]]
then
echo -e "${FUSHIA}${PS3}${RAZ}\n"
else
echo
fi
# Affichage de la liste des choix
for x in "${@}"
do
# En cas de limite, on saute la 1ere valeure qui est le chiffre donné
if [[ ${limite} && -z ${num} ]]
then
num=0
else
# Incrémentation du numéro pour la prochaine ligne
((num++))
# recherche le signe servant de séparateur entre la valeur et la description
if [[ "${x}" =~ "@@" ]]
then
# Si séparateur présent : affichage du numéro, de la valeur du texte et de la description
echo -e "${FUSHIA}${num}${RAZ}) ${BLEUFONCE}${x%%@@*}${RAZ} : ${VERT}${x##*@@}${RAZ}"
else
# Si pas de séparateur : affichage du numéro et de la valeur du texte
echo -e "${FUSHIA}${num}${RAZ}) ${BLEUFONCE}${x}${RAZ}"
fi
fi
done
# Envoie de la réponse dans un tableau
read -p $'\nSélection : ' -a multinum
# Création d'une liste contenant les valeurs textes choisies + Vérification des valeurs numériques
for x in "${multinum[@]}"
do
if [[ ${x} -gt ${#@} || ! ${x} =~ ^[0-9]*$ ]]
then
# Message d'erreur indiquant une réponse impossible
echo -e "\n${ROUGE}Erreur dans la sélection, vous devez rentrez des chiffres inférieurs à la valeur maximale proposée.${RAZ}"
# Destruction des variables
unset multinum multitxt limite
# Arrêt de la fonction en erreur (code 1)
return 1
elif [[ ${limite} && ${#multinum[@]} -gt ${limite} ]]
then
# Message d'erreur indiquant un nombre de reponse trop élevé
echo -e "\n${ROUGE}Nombre de séléction trop importante, la limite est de ${limite} choix.${RAZ}"
# Destruction des variables
unset multinum multitxt limite
# Arrêt de la fonction en erreur (code 1)
return 1
else
# Si il y a eu un argument pour militer le nombre de reponse, on ajoute 1 a x
[[ "${1}" == -[0-9]* ]] && ((x++))
# Ajout de la valeur traitée dans le tableau
multitxt+=("${!x%%@@*}")
fi
done
}
PS3="Liste de question" multiselect "Update@@Mettre à jour le système + noyau" "Firefox@@Installer java libre et son greffon firefox" "Installer la prise en charge dvd" "Activer le clavier numérique au démarrage" "Exit"
# Faire sa selection en indiquant les numeros avec des espaces entre eux
echo "Réponses données en version texte :"
for rep in "${multitxt[@]}"
do
echo "${rep}"
done
echo "Réponses données en version nombre :"
for rep in "${multinum[@]}"
do
echo "${rep}"
done
et exécute le fichier via
bash fichier
PS : Il est dangereux de faire des copier coller sans comprendre mais le code ne devrait entraîner aucun danger vu qu'il ne fait qu'afficher du texte
Dernière modification par Hizoka (Le 31/10/2016, à 17:19)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 31/10/2016, à 18:11
- MineElectricity
Re : Mon scrit bash est-il clair ?
Merci beaucoup !
en fait j'avais simplement oublié le
#!/bin/bash
Je test tout ça :3
Hors ligne
#7 Le 31/10/2016, à 18:34
- Hizoka
Re : Mon scrit bash est-il clair ?
Hesite pas à revenir sur le topic si tu te ne trouves pas les réponses à tes questions.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 31/10/2016, à 18:40
- MineElectricity
Re : Mon scrit bash est-il clair ?
À vrai dire je comprends pas grand chose et trouve ma version plus simple
autant && || et les bases je comprends autant mon problème est que je n'ai pas assez lus les docs donc je comprends pas encore [[ ${x} -gt ${#@} || ! ${x} =~ ^[0-9]*$ ]]
pour le kiff j'ai essayer d’effectuer une action en fonction de 1 mais j'ai pas trouvé comment récupérer 1 dans ${multinum[@]}
Ne t’embête pas à m’expliquer, ça c'est à moi de le lire dans les docs
Bonne soirée!
Hors ligne
#9 Le 31/10/2016, à 18:50
- Hizoka
Re : Mon scrit bash est-il clair ?
Après je t'ai filé une fonction que j'ai créé au bout d'un certain temps ne trouvant rien qui corresponde à mes besoins.
Tu n'es pas obligé de tout comprendre pour l'utiliser
pour le kiff j'ai essayer d’effectuer une action en fonction de 1 mais j'ai pas trouvé comment récupérer 1 dans ${multinum[@]}
pas compris...
${multinum[@]} contient toutes les réponses numériques.
Sinon en plus simple mais moins joli il existe select
ex :
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1" ;;
"Option 2")
echo "you chose choice 2" ;;
"Option 3")
echo "you chose choice 3" ;;
"Quit")
break ;;
*) echo invalid option;;
esac
done
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 31/10/2016, à 19:03
- MineElectricity
Re : Mon scrit bash est-il clair ?
Select m'as l'air plus compréhensible mais corresponds pas à mon besoin
ce que je voulais dire c'est que si j'écris "1 2 4" arriver à savoir si j'ai écris 1 ou pas dans la réponse en nombre; en gros récupérer le read pour l'utiliser
Ce me serait aussi utile dans un autre projet (plus gros et longs) qui consiste à trouver un nombre de 1 à n qui le temps de l'atteindre à était écrit n * 1, je cherche donc une commande pour lire dans tout les nombres précédents le nombre de chiffres 1 pour ensuite les additionner et vérifier si nombre_de_1 = 1
J'ai fait tout le script en python sauf la partie pour compter les 1 précédents x')
Hors ligne
#11 Le 31/10/2016, à 19:25
- Hizoka
Re : Mon scrit bash est-il clair ?
ce que je voulais dire c'est que si j'écris "1 2 4" arriver à savoir si j'ai écris 1 ou pas dans la réponse en nombre; en gros récupérer le read pour l'utiliser
multinum=(1 2 3 4 5 6 7)
for rep in ${multinum[@]}
do
case ${rep} in
1) echo "reponse 1" ;;
2) echo "reponse 2" ;;
3) echo "reponse 3" ;;
4) echo "reponse 4" ;;
*) echo "reponse sup à 4" ;;
esac
done
ou
multinum=(1 2 3 4 7 8 9 10 11 12 14)
grep -w "1" <<< ${multinum[@]}
J'ai pas tout pigé à ce que tu veux faire mais pour compter le nombre de 5 dans la liste :
multinum=(1 5 3 4 7 8 9 5 11 12 5)
grep -w -c "5" <<< ${multinum[@]}
Mais si tu te debrouilles en python pourquoi venir vers bash ?
Dernière modification par Hizoka (Le 31/10/2016, à 19:26)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 31/10/2016, à 19:40
- MineElectricity
Re : Mon scrit bash est-il clair ?
Merci
Bah j'ai commencé avec python car je savait pas par quoi commencer, et là j'ai fait du bash juste pour avoir un script postinstall x')
du coup ton grep m'est bien pratique merci !
Hors ligne
#13 Le 31/10/2016, à 20:12
- pingouinux
Re : Mon scrit bash est-il clair ?
Bonsoir,
@Hizoka #11 : gep -c compte les lignes, et ici il n'y en a qu'une
multinum=(1 5 3 4 7 8 9 5 11 12 5)
grep -w -c "5" <<< ${multinum[@]}
1
Tu peux faire ceci :
grep -ow "5" <<< ${multinum[@]} | wc -l
3
Hors ligne
#14 Le 31/10/2016, à 20:28
- Hizoka
Re : Mon scrit bash est-il clair ?
en effet, merci pingouinux
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 31/10/2016, à 20:51
- MineElectricity
Re : Mon scrit bash est-il clair ?
(du coup je change un peut de sujet ... j’espère que ça gènes pas trop
du coup mon petit script donne ca
#!/bin/sh
# le but de ce script est de compter le nombre de fois qu'il y à de 1 de 1 à n
# le premier est donc 1, il y à 1 1 jusqu'à avoir atteinds 1
# num = le numéro auquel on est (on commence de 2 pour pas trouver 1)
num=(1 2)
# chif = le nombre de 1 pour atteindre ce num (on commence de 2)
chif=(2)
# On compte le nombre de 1
grep -ow "1" <<< ${num[@]} | wc -l
# On fait la boucle tant que on ne trouve pas autant de 1 que le nombre et on interdit le nombre 1 en résultat
while [ "$num" != "$chif" ]
do
# ajoute 1 au nombre
chif=(($chif+1))
# ajoute le nombre dans la liste
echo "$chif" >> ${num[@]}
# affiche le nombre de 1 dans la liste
grep -ow "1" <<< ${num[@]} | wc -l
done
echo "le résultat est $chif"
exit 0;
mais il me retourne:
ligne 22: erreur de syntaxe près du symbole inattendu « done »
ligne 22: `done'
Hors ligne
#16 Le 31/10/2016, à 22:08
- Hizoka
Re : Mon scrit bash est-il clair ?
chif=(($chif+1))
=>
chif=$(($chif+1))
echo "$chif" >> ${num[@]}
=>
num+=($chif)
mais ca te fait une boucle infini la...
la comparaison de while n'est pas bonne.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 31/10/2016, à 22:27
- MineElectricity
Re : Mon scrit bash est-il clair ?
#!/bin/bash
# le but de ce script est de compter le nombre de fois qu'il y à de 1 de 1 à n
# le premier est donc 1, il y à 1 1 jusqu'à avoir atteinds 1
# num = le numéro auquel on est (on commence de 2 pour pas trouver 1)
num=(1 2)
# chif = le nombre de 1 pour atteindre ce num (on commence de 2)
chif=(2)
# On fait la boucle tant que on ne trouve pas autant de 1 que le nombre
while [ "$num" != "$chif" ]
do
# ajoute 1 au nombre
chif=$(($chif+1))
# ajoute le nombre dans la liste
num+=($chif)
# affiche à l'user à quel nombre on est
echo "on en est aux nombre $chif qui à un nombre de 1 de:"
# affiche le nombre de 1 dans la liste
grep -o "1" <<< ${num[@]} | wc -l
done
echo "le résultat est $chif"
exit 0;
Mais comment tu sait que la boucle est infinie ?
edit: Okai le problème est impossible je comprends mieux.
Merci de ton aide, je reposterai si jamais j'ai d'autres questions (après avoir lus les docs) sur mon script postinstall :3
Dernière modification par MineElectricity (Le 31/10/2016, à 22:54)
Hors ligne
#18 Le 01/11/2016, à 14:33
- MineElectricity
Re : Mon scrit bash est-il clair ?
Bon je suis donc repassé sur mon script postinstall et je dois avouer que l'idée du combo until + case m'a bien plue
#!/bin/bash
#2016/11/01 on ubuntu 16.04
#This scrit was writen to complete ubuntu 16.04 installation
#Writen by MineElectricity
#we do a loop with until to ask what to to with case and remember this with name=1
until [ $script = 1 ] || [ $cancel = 1 ]
do
PS3='Please enter your choice: '
options=("full update + full clean" "install minimal apps" "install bonus apps" "prelink" "personnalized command" "select 1 + 2 + 3 + 4" "launch script" "Cancel + quit")
select opt in "${options[@]}"
do
case $opt in
"full update + full clean")
echo "you chose update + clean"
update=1
break ;;
"install minimal apps")
echo "you chose minimal apps"
minimal=1
break ;;
"install bonus apps")
echo "you chose bonus apps"
bonus=1
"prelink"
echo "you chose prelink"
prelink=1
"personnalized command"
echo "write your command (without the word sudo)(only one possible, reentering in this menu will remove the precedent written command) : "
read execute
exe=1
break;;
"select 1 + 2 + 3 + 4")
echo "you chose update + minimal + bonus + prelink"
update=1
minimal=1
bonus=1
prelink=1
"Launch script"
script=1
break ;;
"Cancel + quit")
cancel=1
break ;;
*) echo invalid option;;
esac
done
done
#the real script launch you can know wish stem we are with the $name after the if veryfing if the user selected the $name
echo "-------------------\nSome errors may happen please read the terminal, my script don't highligh them\n-------------------"
if [ $update = 1 ]
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y
echo "------update + clean ok------"
fi
if [ $minimal = 1 ]
apt-get install -y default-jre icedtea-plugin
echo "java libre ok"
apt-get install -y libdvd-pkg && dpkg-reconfigure libdvd-pkg
echo "dvd ok"
sed -i 's|^exit 0.*$|# Numlock enable\n[ -x /usr/bin/numlockx ] \&\& numlockx on\n\nexit 0|' /etc/rc.local
echo "numpad at boot ok"
sed -i 's|^exit 0.*$|# Bluetooth disabled\nrfkill block bluetooth\n\nexit 0|' /etc/rc.local
echo 'Bluetooth at boot off'
apt-get install -y zram-config language-pack-fr language-pack-fr-base language-pack-gnome-fr language-pack-gnome-fr-base vlc
command gsettings set com.canonical.Unity.Lenses disabled-scopes "['more_suggestions-amazon.scope', 'more_suggestions-u1ms.scope', 'more_suggestions-populartracks.scope', 'music-musicstore.scope', 'more_suggestions-ebay.scope', 'more_suggestions-ubuntushop.scope', 'more_suggestions-skimlinks.scope']"
command gsettings set 'com.canonical.Unity.ApplicationsLens' 'display-available-apps' 'false'
echo "zram + francais + cannonical buy suggestions ok"
echo "------minimal ok------"
fi
if [ $bonus = 1 ]
apt-get install -y audacity blender gimp gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen skype cheese unity-tweak-tool
echo "------bonus ok------"
fi
if [ $prelink = 1 ]
apt-get -y install prelink && sed -i 's/PRELINKING=unknown/PRELINKING=yes/' /etc/default/prelink && /etc/cron.daily/prelink
echo 'DPkg::Post-Invoke {"echo Pré-raccordement des bibliothèques en cours, veuillez patienter...;/etc/cron.daily/prelink";}'| tee -a /etc/apt/apt.conf.d/98prelink
echo "------prelink------"
fi
if [ $exe = 1 ]
execute
fi
#maj et clean du système avant de quitter
apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get autoclean -y
echo "script finished, please read the terminal to verify if errors occured"
exit 0;
:3
Dernière modification par MineElectricity (Le 01/11/2016, à 17:06)
Hors ligne
#19 Le 01/11/2016, à 18:09
- Compte anonymisé
Re : Mon scrit bash est-il clair ?
Bonsoir,
Super travail !
plusieurs remarques sur ton script :
if [ $update = 1 ]
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y
echo "------update + clean ok------"
a mon avis il y a 2 commandes superflues. apt-get autoclean fait moins que apt-get clean donc inutile, et full-upgrade et upgrade je pense que full-upgrade fait plus (j'arrive pas à le trouver dans le man).
Le "echo" apparaît même si les commandes échouent. Peut-être qu'afficher le message que si les commandes réussissent, avec par exemple :
if [ $update = 1 ]
apt update -y && apt full-upgrade -y && apt autoremove -y && apt autoclean -y && echo "------update + clean ok------"
D’ailleurs tu peux aussi remplacer tous les apt-get par apt dans Ubuntu 16.04.
apt-get install -y libdvd-pkg && dpkg-reconfigure libdvd-pkg
je pense que le paquet se configure tout seul après l'avoir installé.
sed -i 's|^exit 0.*$|# Numlock enable\n[ -x /usr/bin/numlockx ] \&\& numlockx on\n\nexit 0|' /etc/rc.local
là tu utilise /usr/bin/numlockx mais qui existe que si on install numlockx (ce qui est a priori pas le cas dans le script).
Question subsidiaire, tu vois une différence notable niveau réactivité/consommation avec zram et prelink d'installé ?
#20 Le 01/11/2016, à 18:59
- MineElectricity
Re : Mon scrit bash est-il clair ?
Merci de ta réponse Anonyme68 !
Merci pour le && j'y avais pas pensé je vais réjouter ca de suite !
Pour le apt je sait pas si je veux vraiment l'enlever, tant qu'ils n’annoncent pas supprimer apt-get je préfère laisser ça comme ça ^ .^
pour le numlock c'est écrit dans /etc/rc.local donc ca suffit (tester sur mon pc sans numlockx)
Pour moi zram est obligatoire pour éviter l'utilisation abusive du disque dur (et surtout sur ssd) prelink j'ai pas trop vus de différence, autant dans la ram que avec le dd donc je le met en option vu que c'est du dépot universe.
Entre temps j'ai changé mon script (je devrais peut être ajouter des options ?)
#!/bin/bash
# 2016/11/01 on ubuntu 16.04
# This scrit was writen to complete ubuntu 16.04 installation
# Writen by MineElectricity
# we do a loop with until to ask what to to with case and remember this with name=1
# PS3 is associated with the select option, it's the phrase before the user's prompt
PS3='Please enter your choice: '
# The options the user can select
options=("full update + full clean" "install minimal apps" "install bonus apps" "prelink" "personnalized command" "select 1 + 2 + 3 + 4" "launch script" "cancel + quit")
# an color for the user so he can se better the important things
red='\e[0;31m'
green='\e[1;32m'
neutral='\e[0;m'
# names used to configure "things" to do
update="will the script do apt-get update upgrade ..."
minimal="install java-libre, dvd support, zram-config, cheese, french language, activate numlock on boot and desactivate bluetooth on boot and deactivate canonnical adds"
bonus="install less frequently used application like gimp and gnome-session-flashback"
prelink="install prelink (used to accelerate applications' start)"
script="launch the following of the script"
comfirmation=echo -e "${red} step finished correctly ${neutral}"
# until the script option is at 1 the menu show again
until [ "$script" = 1 ]
do
# launch the select menu
select opt in "${options[@]}"
do
# alternative to if statement to choose one thing, once choosen it turn to 1
# so later the script can launch the "things" then break to close the menu (reopened by until)
case $opt in
"full update + full clean")
echo "you chose update + clean"
update=1
break ;;
"install minimal apps")
echo "you chose minimal apps"
minimal=1
break ;;
"install bonus apps")
echo "you chose bonus apps"
bonus=1
break;;
"prelink")
echo "you chose prelink"
prelink=1
break;;
"personnalized command")
echo "write your command (without the word sudo)(only one possible, reentering in this menu will remove the precedent written command) : "
read execute
exe=1
break;;
"select 1 + 2 + 3 + 4")
echo "you chose update + minimal + bonus + prelink"
update=1
minimal=1
bonus=1
prelink=1
break;;
"launch script")
script=1
break ;;
"cancel + quit")
exit 10;
break ;;
*) echo invalid option;;
esac
done
done
# the real script launch you can know wich step we are
# with the $name after the if veryfing if the user selected the $name
# -e to allow using $
echo -e "${red}Some errors may happen please read the terminal, you can see where they are if you only see one red message and no green. Another update + clean will happen at the end of the script (after the bonus and prelink) ${neutral}"
# every time i do command && tell it's ok and then in another command tell it's finished.
if [ "$update" = 1 ]; then
# update the system
apt-get update && apt-get upgrade -y && apt-get full-upgrade -y && apt-get -y clean && apt-get autoremove -y && apt-get autoclean -y && echo -e "${green}update + clean finished with no problem${neutral}"
echo -e "${red}------update + clean command finished------${neutral}"
fi
if [ "$minimal" = 1 ]; then
# install java
apt-get install -y default-jre icedtea-plugin && echo -e "${green}java libre finished with no problem${neutral}"
echo "${red}java libre finished${neutral}"
# configure dvd to be readable
apt-get install -y libdvd-pkg && dpkg-reconfigure libdvd-pkg && echo -e "${green}dvd configured with no problem${neutral}"
echo "${red}dvd finished${neutral}"
# activate numlock on boot
sed -i 's|^exit 0.*$|# Numlock enable\n[ -x /usr/bin/numlockx ] \&\& numlockx on\n\nexit 0|' /etc/rc.local && echo -e "${green}numpad has been set ON at boot${neutral}"
echo "${red}numpad at boot finished${neutral}"
# deactivate bluetooth on boot
sed -i 's|^exit 0.*$|# Bluetooth disabled\nrfkill block bluetooth\n\nexit 0|' /etc/rc.local && echo -e "${green}bluetooth has been set OFF at boot${neutral}"
echo -e "${red} Bluetooth at boot finished${neutral}"
# install application that I think should be in every ubuntu
apt-get install -y zram-config language-pack-fr language-pack-fr-base language-pack-gnome-fr language-pack-gnome-fr-base vlc cheese && echo -e "${green}zram + fr + vlc + cheese installation ok${neutral}"
echo -e "${red} basic programs install finished${neutral}"
# remove ubuntu advertisment suggestions
command gsettings set com.canonical.Unity.Lenses disabled-scopes "['more_suggestions-amazon.scope', 'more_suggestions-u1ms.scope', 'more_suggestions-populartracks.scope', 'music-musicstore.scope', 'more_suggestions-ebay.scope', 'more_suggestions-ubuntushop.scope', 'more_suggestions-skimlinks.scope']" && command gsettings set 'com.canonical.Unity.ApplicationsLens' 'display-available-apps' 'false' && echo -e "${green}cannonical suggestion set to OFF${neutral}"
echo -e "${red}zram + francais + cannonical buy suggestions finished${neutral}"
echo -e "${red}------minimal finished------${neutral}"
fi
if [ "$bonus" = 1 ]; then
# install application that may be used by a medium user
apt-get install -y audacity blender gimp gnome-session-flashback gnome-shell mixxx openshot pavucontrol vokoscreen skype unity-tweak-tool && echo -e "${green}bonus ok${neutral}"
echo -e "${red}------bonus finished------${neutral}"
fi
if [ "$prelink" = 1 ]; then
# install prelink && prelink will update when a package is installed
apt-get -y install prelink && sed -i 's/PRELINKING=unknown/PRELINKING=yes/' /etc/default/prelink && /etc/cron.daily/prelink && echo 'DPkg::Post-Invoke {"echo Pré-raccordement des bibliothèques en cours, veuillez patienter...;/etc/cron.daily/prelink";}'| tee -a /etc/apt/apt.conf.d/98prelink && echo -e "${green}------prelink ok------${neutral}"
echo -e "${red}------prelink finished------${neutral}"
fi
# eval is to execute the command
if [ "$exe" = 1 ]; then
eval "$execute" && echo -e "${green}personnalized command finished${neutral}"
echo -e "${red}personnalized command ok${neutral}"
fi
# update and clean before quit
apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get autoclean -y && echo -e "${green}final update + clean ok${neutral}"
echo -e "${red}final update + clean finished${neutral}"
echo -e "${green}script finished, please read the terminal to verify errors (if one occured there is no green(ok) on top of red(finished))${neutral}"
exit 0;
Hors ligne