#1 Le 25/03/2018, à 10:17
- Compte supprimé
ptit gestionnaire de script.sh pour me faire la main
Bonjour,
Débutant en bash , j'ai écrit ce ptit gestionnaire de script pour faire le ménage dans mes fichiers.sh.
Je compte le modifier par la suite pour lui faire une cosmétique et en améliorer l'usage . Mon but étant aussi de créer des situations d'études qui me feront progresser dans mon usage/apprentissage du bash.
Le script ci dessous à son démarrage crée un fichier listescript.txt contenant les scripts trouvés numérotés . listescript.txt sert d'index...
notes: Pour pouvoir tester sans risque , la commande rm est désactiver
crtl c pour quitter... .
#!/bin/bash
####################################################################
########## ###########
########## monscript_affiche_efface_script.sh ###########
########## brut de coffrage chapitre 1 ###########
########## édition 1.1 ###########
########## ###########
####################################################################
declare -i tt=3 # compteur fichier.sh utilisé pour fanny () .
declare -i nbrmax=100
fanny () {
cat listescript.txt | grep -w "$1" # cherche tous les fichiers .sh le numéro en cours
}
yapluka () { #pour le fun
echo " "
echo "Yapluka...youpppi"
sleep 1
}
#constitution d'un fichier listant script.sh sous la forme "nbr ./script
find . -iname "*.sh" 2> /dev/null | cat -n>listescript.txt
clear
cat listescript.txt | wc -l 2> nbrmax
head -n25 $(fanny ${tt} | cut -f2)
# Début du script boucle while
while [ $tt -le $nbrmax ] ; do
sleep 1
echo -e "\033[31;1;4;5;7mXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "X Veux tu <C>ontinuer la recherche d'un autre script.sh ? X"
echo -e "X (<-> pour marche arrière) X"
echo -e "X <A>fficher l'intégralité de ce script X"
echo -e "x <E>ffacer ce script x"
echo -e "x <L>ister l'ensemble des script x"
echo -e "x <G>o directement au script numéro : x"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\033[0m"
read ouinon
case $ouinon in
[eE])
echo -e "\033[31;1;4;5;7mAttention je vais effacer $(fanny $tt) \033[0m"
echo "valide en appuyant sur retour... ctrl C pour annuler"
read
yapluka
mv=$(fanny ${tt} | cut -f 2 ) #
echo "j'ai effacé $mv "
# rm $mv # attention rm Remove
sed -i $tt,${tt}'s/sh/XXXXeffacé_effacé_effacé!!_XXXX/g' listescript.txt #marquage "effaçacé" sur la listescript
;;
[cC])
yapluka
tt=tt+1 # # Incrémentation numero du script
echo -e "\033[31;1;4;5;7m Nom du script: $(fanny $tt) Numéro du script: $tt \033[0m "
sleep 1
head -n25 $(fanny ${tt} | sed -e 's/^[[:digit:]]//g') 2>/dev/null
;;
[-])yapluka
tt=tt-1 # # Incrémentation numero du script
echo -e "\033[31;1;4;5;7m Nom du script: $(fanny $tt) Numéro du script: $tt \033[0m "
sleep 1
head -n25 $(fanny ${tt} | sed -e 's/^[[:digit:]]//g') 2>/dev/null
;;
[aA])
yapluka
less $(fanny $tt | cut -f2) #Affiche le script.sh en cours en mode less
;;
[lL])
yapluka
echo "liste des programmes:"
cat listescript.txt | less
;;
[gG])
echo "numéro:?"
read tt
yapluka
head -n25 $(fanny $tt | cut -f 2 )
;;
esac
done
#2 Le 26/03/2018, à 10:38
- kholo
Re : ptit gestionnaire de script.sh pour me faire la main
salut,
bon, trop de cat tue le cat !
fanny () {
# cherche tous les fichiers .sh le numéro en cours
# cat "$listTemp" | grep -w "$1" # NON
grep -w "$1" "$listTemp"
}
cat listescript.txt | grep -w "$1"
grep -w "$1" listescript.txt
[lL])
yapluka
echo "liste des programmes:"
less listescript.txt
;;
... faut encore savoir qu'il faut faire :q pour quitter !
find . -iname "*.sh" 2> /dev/null | cat -n >listescript.txt
un tableau est plus simple à gérer
pas testé mais pour le principe :
monTableau=$(find . -iname "*.sh" 2> /dev/null)
IFS=$'\n' monTableau=( $monTableau )
echo "premier élément du tableau : ${monTableau[0]}"
afficher tous les éléments
n=0
for element in ${monTableau[@]}
do
echo "element $n : ${monTableau[$n]}"
n++
done
cat "$listTemp" | wc -l 2> nbrmax # NON ça crée un fichier...
nbrmax=$(cat "$listTemp" | wc -l ) # fonctionnel mais PAS MIEUX !
nbrmax=$(wc -l "$listTemp")
ou en interceptant les erreurs :
nbrmax=$(wc -l "$listTemp" 2>/dev/null)
deux ou trois petites astuces :
les couleurs factorisées
le -n 1 du read car tu n'utilises qu'une lettre donc ça évite le Enter pour valider
# COULEURS
enRouge='\033[31;1;4;5;7m'
enDefaut='\033[0m'
echo -e "${enRouge}"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "X Veux tu <C>ontinuer la recherche d'un autre script.sh ? X"
echo -e "X (<-> pour marche arrière) X"
echo -e "X <A>fficher l'intégralité de ce script X"
echo -e "x <E>ffacer ce script x"
echo -e "x <L>ister l'ensemble des script x"
echo -e "x <G>o directement au script numéro : x"
echo -e "x <Q>pour quitter x"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "${enDefaut}"
read -n 1 ouinon
pour quitter, ajouter au case :
...
[qQ]) exit 0 ;;
esac
une variable pratique pour déboguer un script bash : $LINENO
affiche le numéro de la ligne en cours
Hors ligne
#3 Le 26/03/2018, à 11:38
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Salut kholo,
Merci pour ton aide et astuces ... Je n'ai pas utilisé de tableau n'en ayant jusqu'à présent encore jamais utilisé... c'est l'occasion d'étudier cela , je vais re-écrire le script en conséquence ...
#4 Le 26/03/2018, à 15:35
- kholo
Re : ptit gestionnaire de script.sh pour me faire la main
oui, c'est très fort de maîtriser les tableaux et pas compliqué...
Hors ligne
#5 Le 29/03/2018, à 14:48
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour,
voilà... C'est beaucoup mieux ainsi
Note rm désactivé pour essai . <q> pour quitter
#!/bin/bash
####################################################################
########## ###########
########## monscipt_affiche_efface_script.sh ###########
########## brut de coffrage chapitre 2 ###########
########## édition 1.2 ###########
########## ###########
####################################################################
noir='\033[0m'
rouge='\033[31;1;4;5;7m'
declare -i tt=3 # compteur fichier.sh utilisé pour fanny () .
declare -i nbrmax=0
yapluka () { #pour le fun
echo " "
echo "Yapluka...youpppi"
sleep 1
}
#constitution d'un tableau listant tous les script.sh
listescript=$( find . -iname "*.sh" -user fabien 2>/dev/null )
IFS=$'\n' listescript=( $listescript )
# détermination nbrmax:
nbrmax=${#listescript[*]}
nbrmax=$(($nbrmax-1))
#1er affichage
clear
head -n25 ${listescript[tt]}
# Début du script boucle while
while [ $tt -lt $nbrmax ] ; do
sleep 1
echo -e "${rouge}"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "X Veux tu <C>ontinuer la recherche d'un autre script.sh ? X"
echo -e "X (<-> pour marche arrière) X"
echo -e "X <A>fficher l'intégralité de ce script X"
echo -e "x <E>ffacer ce script x"
echo -e "x <L>ister l'ensemble des script x"
echo -e "x <G>o directement au script numéro : x"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "${noir}"
read -n1 ouinon
case $ouinon in
[eE])
mv=${listescript[tt]} #
zenity --warning --text "<span color=\"red\">Je vais effacer ${listescript[tt]}</span>" 2>\dev\null
if [ $? -eq 0 ]
then
listescript[$tt]="Ce script n'est plus ..."
# rm $mv
fi
;;
[cC])
yapluka
tt=tt+1 # # Incrémentation numero du script
echo -e "\033[31;1;4;5;7m Nom du script: ${listescript[tt]} Numéro du script: $tt \033[0m "
sleep 1
head -n25 ${listescript[tt]}
;;
[-])yapluka
tt=tt-1
echo -e "\033[31;1;4;5;7m Nom du script: ${listescript[tt]} Numéro du script: $tt \033[0m "
sleep 1
head -n25 ${listescript[tt]}
;;
[aA])
yapluka
less ${listescript[tt]} #Affiche le script.sh en cours en mode less
;;
[lL])
yapluka
echo "liste des programmes:"
n=0
for script in ${listescript[@]}
do
echo "Script $n ${listescript[n]}"
n=$(($n+1))
done
;;
[gG])
echo "numéro:?"
read tt
yapluka
head -n25 ${listescript[tt]}
;;
[qQ])
clear
echo "à bientôt"
exit
esac
done
#6 Le 29/03/2018, à 14:59
- kholo
Re : ptit gestionnaire de script.sh pour me faire la main
voilà un menu que j'utilise comme modèle
#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION=""
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# kholo 2018
# ----------------------------------------------
echo "lancement $nomlogiciel..."
# echo "chargement ligne $LINENO"
# set -o xtrace
# ******************************************************************
# pour ouvrir un navigateur de fichier (debuggage)
# ******************************************************************
# nautilus "$PWD" ; exit 0
# ******************************************************************
# fixe la taille de la fenetre
# ******************************************************************
/usr/bin/resize -s 31 130 > /dev/null
reset > /dev/null
# ******************************************************************
# DECLARATION DES COULEURS
# ******************************************************************
# https://misc.flogisoft.com/bash/tip_colors_and_formatting
# explications
# echo -e "\033[31mHello\033[00m"
# On écrit \033, on met un crochet ouvrant [,
# puis on met le code de la couleur choisie (ici, 31 signifie rouge)
# et on finit avec un m.
# On affiche notre texte,
# ici Hello, puis on remet la couleur à noir (\033[00m),
# sinon le reste sera écrit en rouge aussi. :)
#
# exemples complexes
# enNoir='\033[1;30;40m'
# enRouge='\033[1;31;40m'
# enVert='\033[0;32;40m'
# enJaune='\033[1;33;40m'
fdNoir='\033[40m'
fdRouge='\033[41m'
fdVert='\033[42m'
fdJaune='\033[43m'
fdBleu='\033[44m'
fdRose='\033[45m'
fdCyan='\033[46m'
fdGris='\033[47m'
# fdDefaut='\033[49m'
enNoir='\033[30m'
enRouge='\033[31m'
enVert='\033[32m'
enJaune='\033[33m'
enBleu='\033[34m'
enRose='\033[35m'
enCyan='\033[36m'
enGris='\033[37m'
# enDefaut='\033[39m'
enGras='\033[1m'
enSouligner='\033[4m'
enClignotant='\033[5m'
enSurligner='\033[7m'
encache='\033[8m'
enDefaut='\033[0m'
# ******************************************************************
# JOURNAL
# ******************************************************************
fichier_log="${nomlogiciel}.log"
> "${fichier_log}"; # remet le journal à zéro
journal () { echo -e "$@" >> "${fichier_log}" ; }
journal "*******************initialisation*******************"
journal "chargement"
# ******************************************************************
# FONCTIONS POUR LA LISTE DE CHOIX
# ******************************************************************
pause () { read -p 'Appuyer sur [Enter] pour continuer...' ; }
on_clear_terminal () {
# echo -e "${enDefaut}"
reset > /dev/null
}
afficherMenu () {
echo -e "${enJaune}${enGras}"
echo -e "______________________________"
echo -e "Un titre."
echo -e "Ce module crée une liste de choix"
echo -e ""
echo -e "Faire un choix dans :"
echo -e "______________________________"
echo -e "${enJaune} 1. ${enVert}voir"
echo -e "${enJaune} 2. ${enVert}ouvrir"
echo -e "${enJaune} 3. ${enVert}enregistrer"
echo -e "${enJaune} 4. ${enVert}enregistrer-sous"
echo -e "${enJaune} 5. ${enVert}fonction test"
echo -e "${enJaune}______________________________"
echo -e "${enRouge} q. ${enVert}Quitter"
echo -e "${enVert}______________________________\n"
echo -en "${enGris}Votre choix : "
}
parserChoix () {
journal "parserChoix $1"
case "$choix" in
0) ;; # ne fait rien !
1) action 1 ;;
[2-4]) action "$choix" ;;
5) fonction_test ;;
q|Q) _quitter ;;
*) ;;
esac
# pause
}
_quitter () {
journal "_quitter"
# mettre ici tout ce qui sera nescessaire à la bonne fermeture
exit 0
}
# ******************************************************************
# METTRE TOUTES LES FONCTIONS ICI
# ******************************************************************
action () {
echo -e "${enRouge}${enGras}vous avez choisi action $1 \n ... choisissez '5' !"
pause
}
fonction_test () {
echo -e "${enJaune}${enGras}$(date)\n${enGris}On peut mettre ce que l'on veut ici"
pause
}
# ******************************************************************
# FONCTION PRINCIPALE
# ******************************************************************
_main () {
on_clear_terminal
afficherMenu
# saisie du choix
read -r -n 1 choix # si les choix sont sur 1 caractère
# read -r choix # si les choix sont sur 2 caractères
on_clear_terminal
parserChoix
_main
}
_main
exit 0
Hors ligne
#7 Le 29/03/2018, à 15:29
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Je note sur ton script que tu fais usages de
reset > /dev/null
au lieu d'un clear .
Je découvre aussi
/usr/bin/resize -s 31 130 > /dev/null
pour définir la grandeur du terminal .
Peux tu m'en dire plus?
Dernière modification par Compte supprimé (Le 29/03/2018, à 15:31)
#8 Le 30/03/2018, à 09:49
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour,
Je découvre les séquences d'échappement ANSI ... J'en profite pour faire une cosmétique au script
#!/bin/bash
####################################################################
########## ###########
########## monscipt_affiche_efface_script.sh ###########
########## brut de coffrage chapitre 2 ###########
########## édition 1.2 ###########
########## ###########
####################################################################
noir='\033[0m'
rouge='\033[31;1;4;5;7m'
declare -i tt=3 # compteur fichier.sh
declare -i nbrmax=0
dialogue () {
echo -e "${rouge}"
echo -en "\033[1;1H" #place le curseur en haut à droite
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "X Veux tu <C>ontinuer la recherche d'un autre script.sh ? X"
echo -e "X (<-> pour marche arrière) X"
echo -e "X <A>fficher l'intégralité de ce script X"
echo -e "x <E>ffacer ce script x"
echo -e "x <L>ister l'ensemble des script x"
echo -e "x <G>o directement au script numéro : x"
echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "${noir}"
}
yapluka () { #pour le fun
echo -en "\033[1;100H" #déplace le curseur
echo "Yapluka...youpppi"
sleep 1
echo -en "\033[1;100H"
echo " " #efface Yapluka...youppi
}
#constitution d'un tableau listant tous les script.sh
listescript=$( find . -iname "*.sh" -user fabien 2>/dev/null )
IFS=$'\n' listescript=( $listescript )
# détermination nbrmax:
nbrmax=${#listescript[*]}
nbrmax=$(($nbrmax-1))
#1er affichage
clear
echo -en "\033[11;1H"
head -n25 ${listescript[tt]}
# Début du script boucle while
while [ $tt -lt $nbrmax ] ; do
sleep 1
dialogue
read -n1 ouinon
case $ouinon in
[eE])
mv=${listescript[tt]} #
zenity --warning --text "<span color=\"red\">Je vais effacer ${listescript[tt]}</span>" 2>\dev\null
if [ $? -eq 0 ]
then
listescript[$tt]="${rouge} Ce script n'est plus ...${noir}"
# rm $mv
fi
;;
[cC])
yapluka
tt=tt+1 # # Incrémentation numero du script
clear
dialogue
echo -e "${rouge}"
echo -en "\033[11;1H"
echo -e "Nom du script: ${listescript[tt]} Numéro du script: $tt "
echo -e "${noir}"
sleep 1
head -n25 ${listescript[tt]}
;;
[-])yapluka
tt=tt-1
echo -en "\033[11;1H"
echo "${rouge}"
echo -e "Nom du script: ${listescript[tt]} Numéro du script: $tt \033[0m "
sleep 1
head -n25 ${listescript[tt]}
;;
[aA])
yapluka
less ${listescript[tt]} #Affiche le script.sh en cours en mode less
;;
[lL])
yapluka
clear
dialogue
echo -en "\033[11;1H"
echo "liste des programmes:"
n=0
for script in ${listescript[@]}
do
echo -e "Script $n ${listescript[n]}"
n=$(($n+1))
if [ $n -eq 26 ] # à développer pour une gestion de l'affichage d'une liste allant jusqu'à 150 scripts
then
read
clear
dialogue
echo -en "\033[11;1H"
fi
done
;;
[gG])
echo -n "numéro:?"
read tt
yapluka
clear dialogue
echo -en "\033[11;1H"
head -n25 ${listescript[tt]}
;;
[bB])
clear
bash ${listescript[tt]}
;;
[qQ])
clear
echo "à bientôt"
exit
;;
esac
done
Bien que la cosmétique du script est suffisante , je me propose , pour en modifier l'aspect et à fin d'étude, de créer un script qui gère l'affichage dans une fenêtre sur l'écran du terminal . Pour ça je pense utiliser un tableau / caractères d'échappements pour gérer les cordonnées de la fenêtre ...
#9 Le 30/03/2018, à 11:46
- kholo
Re : ptit gestionnaire de script.sh pour me faire la main
je peux t'inviter à lire les man
man reset
man resize
comme toi, j'ai découvert ces astuces en bouffant du code
NB : reset est un poil longuet !
resize fonctionne en nombre de lignes / colonnes
voilà un modèle dont je me sert pour faire des menus
il reste à faire la mise en page du menu
#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION=""
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# kholo 2018
# ----------------------------------------------
echo "lancement $nomlogiciel..."
# echo "chargement ligne $LINENO"
# set -o xtrace
# ******************************************************************
# pour ouvrir un navigateur de fichier (debuggage)
# ******************************************************************
# nautilus "$PWD" ; exit 0
# ******************************************************************
# fixe la taille de la fenetre
# ******************************************************************
/usr/bin/resize -s 31 130 > /dev/null
reset > /dev/null
# ******************************************************************
# DECLARATION DES COULEURS
# ******************************************************************
# https://misc.flogisoft.com/bash/tip_colors_and_formatting
# explications
# echo -e "\033[31mHello\033[00m"
# On écrit \033, on met un crochet ouvrant [,
# puis on met le code de la couleur choisie (ici, 31 signifie rouge)
# et on finit avec un m.
# On affiche notre texte,
# ici Hello, puis on remet la couleur à noir (\033[00m),
# sinon le reste sera écrit en rouge aussi. :)
#
# exemples complexes
# enNoir='\033[1;30;40m'
# enRouge='\033[1;31;40m'
# enVert='\033[0;32;40m'
# enJaune='\033[1;33;40m'
fdNoir='\033[40m'
fdRouge='\033[41m'
fdVert='\033[42m'
fdJaune='\033[43m'
fdBleu='\033[44m'
fdRose='\033[45m'
fdCyan='\033[46m'
fdGris='\033[47m'
# fdDefaut='\033[49m'
enNoir='\033[30m'
enRouge='\033[31m'
enVert='\033[32m'
enJaune='\033[33m'
enBleu='\033[34m'
enRose='\033[35m'
enCyan='\033[36m'
enGris='\033[37m'
# enDefaut='\033[39m'
enGras='\033[1m'
enSouligner='\033[4m'
enClignotant='\033[5m'
enSurligner='\033[7m'
encache='\033[8m'
enDefaut='\033[0m'
# ******************************************************************
# JOURNAL
# ******************************************************************
fichier_log="${nomlogiciel}.log"
> "${fichier_log}"; # remet le journal à zéro
journal () { echo -e "$@" >> "${fichier_log}" ; }
journal "*******************initialisation*******************"
journal "chargement"
# ******************************************************************
# FONCTIONS POUR LA LISTE DE CHOIX
# ******************************************************************
pause () { read -p 'Appuyer sur [Enter] pour continuer...' ; }
on_clear_terminal () {
# echo -e "${enDefaut}"
reset > /dev/null
}
afficherMenu () {
echo -e "${enJaune}${enGras}"
echo -e "______________________________"
echo -e "Un titre."
echo -e "Ce module crée une liste de choix"
echo -e ""
echo -e "Faire un choix dans :"
echo -e "______________________________"
echo -e "${enJaune} 1. ${enVert}voir"
echo -e "${enJaune} 2. ${enVert}ouvrir"
echo -e "${enJaune} 3. ${enVert}enregistrer"
echo -e "${enJaune} 4. ${enVert}enregistrer-sous"
echo -e "${enJaune} 5. ${enVert}fonction test"
echo -e "${enJaune}______________________________"
echo -e "${enRouge} q. ${enVert}Quitter"
echo -e "${enVert}______________________________\n"
echo -en "${enGris}Votre choix : "
}
parserChoix () {
journal "parserChoix $1"
case "$choix" in
0) ;; # ne fait rien !
1) action 1 ;;
[2-4]) action "$choix" ;; # ;°) on peut mettre [0-4] et virer les autres lignes
5) fonction_test ;;
q|Q) _quitter ;;
*) ;;
esac
}
_quitter () {
journal "_quitter"
# mettre ici tout ce qui sera nécessaire à la bonne fermeture
exit 0
}
# ******************************************************************
# METTRE TOUTES LES FONCTIONS ICI
# ******************************************************************
action () {
echo -e "${enRouge}${enGras}vous avez choisi action $1 \n ... choisissez '5' !"
pause
}
fonction_test () {
echo -e "${enJaune}${enGras}$(date)\n${enGris}On peut mettre ce que l'on veut ici"
pause
}
# ******************************************************************
# FONCTION PRINCIPALE
# ******************************************************************
_main () {
on_clear_terminal
afficherMenu
# saisie du choix
read -r -n 1 choix # si les choix sont sur 1 caractère
# read -r choix # si les choix sont sur 2 caractères
on_clear_terminal
parserChoix
_main
}
_main
exit 0
Hors ligne
#10 Le 18/04/2018, à 14:09
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour,
Je voulais une interface ergonomique . Le résultat du script "Fannyfind" (c'est le nom que je lui ai donné
ci dessous me convient... Je le trouve maintenant fini , peut être quelques réglage .
Suite à …
Ce script permet facilement de lister tous les scripts .sh présent dans l’ordi , de visualiser leur contenu , d ‘éditer un script avec vi, de l’effacer , de le renommer , de l’exécuter (avec cmd bash).
Mode d’emploi :
Le script se décline en deux modes de fonctionnement: « affichage liste des scripts » ou « affichage du script »
La touche Entrée permet le passage de l’un à l’autre .
La flèche basse du clavier permet de passer au script supérieur.
La flèche haute permet de passer au script inférieur
La flèche droite effectue un less du script en cours
La flèche gauche active le mode édition (efface /renomme /bash /vi ). « affichage du script »
Touche Q + Entrée pour quitter
Note : J’ai désactivé l’ option effaçage pour le test mais l’option renommage est active !!
Important : Il faut ouvrir le terminal en plein écran pour ce script !!
#!/bin/bash
####################################################################
########## ###########
########## Fannyfind ###########
########## ###########
########## édition 3.0+ ###########
########## ###########
####################################################################
noir='\033[0m'
rouge='\033[31;1;4;5;7m'
vert='\e[01;32m'
fondvert='\033[7;49;92m'
jaune='\033[33m'
declare -i tt=1 # compteur fichier.sh
declare -i nbrmax=0 # nombre correspondant numéro fin de liste des scripts
affichescript () {
clear
dialogue
echo -en "\033[6;1H"
echo "liste des programmes:"
n=0 # colone
g=6 # ligne
for script in ${listescript[@]}
do
[ $n -eq $tt ] && echo -en "${rouge}? ${noir}" # affiche * devant le nom du script en cours
echo -e "${vert}Script $n ${listescript[n]}"
n=$(($n+1))
if [ $n -gt 35 ] # à développer pour une gestion de l'affichage d'une liste de plusieurs pages ...
then
g=$(( $g + 1 ))
echo -en "\033[$g;70H" # Place le curseur sur la 2eme colonne
fi
done
}
info () {
echo -en "\033[6;80H"
echo -en "$vert Info Date du script:"
ls -l ${listescript[$tt]} | awk '{print $7" "$6" "$8}' # affiche les champs correspondants à la date du fichier
echo -en "$noir"
}
dialogue () {
echo -e "${rouge}"
echo -en "\033[1;1H" #place le curseur en haut à droite
echo -e "ᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃ"
#echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e " Fannyfind éditeur 3.0 "
tput cup 1 101 ; echo -e "X"
echo -e "ᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃᐁᐃ"
#echo -e "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo -e "${noir}"
}
mode_edition () {
tput cup 1 110
echo -en "${fondvert}mode EDITION${noir}"
tput cup 1 67
echo -en "${vert} <E>ffacer <Renommer> <V>i <B>ash"
read -n 1 ouinon
case $ouinon in
[eE])
mv=${listescript[tt]} #
zenity --warning --text "<span color=\"red\">Je vais effacer ${listescript[tt]}</span>" 2> /dev/null
if [ $? -eq 0 ]
then
listescript[$tt]="${jaune}effacé!${noir}"
#rm $mv
fi
tt=tt+1
;;
[bB])
clear
bash ${listescript[tt]}
;;
[qQ])
quitte
;;
[vV])
vi ${listescript[tt]}
;;
[rR])
echo -en "\033[1;110H Script à Renommer :"
echo -en "\033[2;110H ${rouge} ${listescript[tt]} "
renomme=`zenity --title 'Ok pour renommer ..' --text 'Quel nom veux tu lui donner ?' --entry 2> /dev/null `
if [ $? -eq 0 ]
then
mv ${listescript[tt]} $renomme
listescript[tt]=$renomme
fi
;;
esac
}
choix () {
flag=1
while [ ${flag} -ne 0 ]
do
clear
dialogue
echo -e "${vert}"
echo -en "\033[6;1H" # positionne le curseur 6,1
echo -e "Script: ${listescript[tt]} Numéro : $tt "
echo -e "${noir}"
head -n35 ${listescript[tt]}
info # routine d'affichage date du script en cours
read -sn 3 ouinon
[ ${#ouinon} -eq 3 ] && case ${ouinon:2} in A) tt=tt-1;; B) tt=tt+1;; C) less ${listescript[tt]} ;; D) mode_edition;; esac;
[ ${#ouinon} -eq 0 ] && affichescript && break
[ $tt -eq $nbrmax ] && echo -en "\a" && tt=tt-1
[ $tt -eq -1 ] && echo -en "\a" && tt=tt+1 # délimite cuseur début liste
[ ${ouinon} = q ] && quitte
done
}
quitte () {
clear
echo "à bientôt"
exit
}
#constitution d'un tableau listant tous les script.sh
listescript=$( find . -iname "*.sh" -user fabien 2>/dev/null )
IFS=$'\n' listescript=( $listescript )
# détermination nbrmax:
nbrmax=${#listescript[*]}
nbrmax=$(($nbrmax-1))
# Efface curseur
tput civis
#1er affichage
clear
affichescript
# Début du script boucle while
while [ $tt -lt $nbrmax ] ; do
dialogue
read -sn 3 ouinon
[[ $ouinon = q || $ouinon = Q ]] && quitte
#choix
[ ${#ouinon} -eq 3 ] && case ${ouinon:2} in A) tt=tt-1;; B) tt=tt+1;; C) yapluka; less ${listescript[tt]};; D) mode_edition ;; esac;
affichescript
[ ${#ouinon} -eq 0 ] && choix
[ $tt -eq $nbrmax ] && echo -en "\a" && tt=tt-1
[ $tt -eq -1 ] && echo -en "\a" && tt=tt+1 && affichescript
[[ $ouinon = q || $ouinon = Q ]] && quitte
done
#11 Le 18/04/2018, à 17:09
- kholo
Re : ptit gestionnaire de script.sh pour me faire la main
salut,
mes observations :
pour être plus général :
listescript=$( find . -iname "*.sh" -user fabien 2>/dev/null )
listescript=$( find . -iname "*.sh" -user $USER 2>/dev/null )
[ ${#ouinon} -eq 3 ] && case ${ouinon:2} in A) tt=tt-1;; B) tt=tt+1;; C) less ${listescript[tt]} ;; D) mode_edition;; esac;
un case sur une ligne c'est moins de lignes mais moins bonne lecture
quelques couleurs et autres
qui traînent encore :
echo -en "\033[6;1H"
echo -en "\033[$g;70H" # Place le curseur sur la 2eme colonne
echo -en "\033[6;80H"
echo -en "\033[1;1H" #place le curseur en haut à droite
...
quottes inversées dépréciées
renomme=`zenity --title 'Ok pour renommer ..' --text 'Quel nom veux tu lui donner ?' --entry 2> /dev/null `
renomme=$(zenity --title 'Ok pour renommer ..' --text 'Quel nom veux tu lui donner ?' --entry 2> /dev/null )
des quottes vont assurer ce genre de lignes (surtout quand y a du mv ou rm devant )
mv ${listescript[tt]} $renomme
mv "${listescript[tt]}" "$renomme"
...
Hors ligne
#12 Le 18/04/2018, à 17:27
- Watael
Re : ptit gestionnaire de script.sh pour me faire la main
salut,
listescript=$( find . -iname "*.sh" -user fabien 2>/dev/null )
listescript n'est pas un tableau !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 18/04/2018, à 17:46
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
@Kholo merci de ton retour .
C'est vrai que j'aurai pu gagner en visibilité ... Je m 'appliquerai à mieux
J'utiliserai le double quotte ( mv "${listescript[tt]}" "$renomme" ) comme tu me le conseilles... Je pensais qu'ils n'étaient pas nécessaires ..
@Watael :
Oui mais la commande
IFS=$'\n' listescript=( $listescript )
le crée , non?
Dernière modification par Compte supprimé (Le 18/04/2018, à 17:49)
#14 Le 18/04/2018, à 18:09
- Watael
Re : ptit gestionnaire de script.sh pour me faire la main
il est périlleux de créer une liste/tableau de cette manière, car les noms de fichiers peuvent contenir n'importe quel caractère, y compris des passage à la ligne.
je préfère passer par une boucle for, avec globstar :
shopt -s globstar nullglob
for f in "$rep"/**/*.sh; do test -f "$f" && tableau+=( "$f" ); done
Dernière modification par Watael (Le 18/04/2018, à 19:36)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 18/04/2018, à 19:29
- MicP
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour watael
Il te manque une aile à nullglob
Dernière modification par MicP (Le 18/04/2018, à 19:29)
Hors ligne
#16 Le 18/04/2018, à 19:36
- Watael
Re : ptit gestionnaire de script.sh pour me faire la main
corrigé,
merci.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 18/04/2018, à 20:26
- MicP
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour pseudofab
Pour répéter la suite de ᐁᐃ sur toute la largeur de l'écran, quelle que soit sa largeur :
printf 'ᐁᐃ%.0s' $( seq $(( $COLUMNS / 2 )) )
Dernière modification par MicP (Le 18/04/2018, à 20:35)
Hors ligne
#18 Le 19/04/2018, à 16:17
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour,
Merci,
@MicP : Bien vu . C'est vrai , que ça peut être nécessaire pour assurer une portabilité ...
Intéressant cette commande :
printf 'ᐁᐃ%.0s' $( seq $(( $COLUMNS / 2 )) )
Je ne suis pas du tout familier à son usage .
J’ai regardé le man et diverses documentations française mais je n’ai pas tous saisi , il me reste des points d’incompréhensions : Si tu peux en détailler l’écriture '%.0s’...
@Watael : C’est entendu , je procéderai comme tu dis . Je retiens ce ‘réglage ‘ de globstar .
J’ai tout à étudier sur les différant paramétrages que permet la commande shopt ..
#19 Le 19/04/2018, à 20:44
- MicP
Re : ptit gestionnaire de script.sh pour me faire la main
Bonsoir
http://wiki.bash-hackers.org/commands/builtin/printf
…
. The dot: Together with a field width, the field is not expanded when the text is longer, the text is truncated instead.
"%.s" is an undocumented equivalent for "%.0s", which will force a field width of zero, effectively hiding the field from output
…
On pouvait donc faire plus court :
printf 'ᐁᐃ%.s' $( seq $(( $COLUMNS / 2 )) )
michel@debg53sw:~$ printf '%s' premier deuxième 3eme 4eme
premierdeuxième3eme4ememichel@debg53sw:~$
michel@debg53sw:~$ printf '%s\n' premier deuxième 3eme 4eme
premier
deuxième
3eme
4eme
michel@debg53sw:~$ printf 'ᐁᐃ%s\n' premier deuxième 3eme 4eme
ᐁᐃpremier
ᐁᐃdeuxième
ᐁᐃ3eme
ᐁᐃ4eme
michel@debg53sw:~$ printf 'ᐁᐃ%.3s\n' premier deuxième 3eme 4eme
ᐁᐃpre
ᐁᐃdeu
ᐁᐃ3em
ᐁᐃ4em
michel@debg53sw:~$ printf 'ᐁᐃ%.0s\n' premier deuxième 3eme 4eme
ᐁᐃ
ᐁᐃ
ᐁᐃ
ᐁᐃ
michel@debg53sw:~$ printf 'ᐁᐃ%.0s' premier deuxième 3eme 4eme
ᐁᐃᐁᐃᐁᐃᐁᐃmichel@debg53sw:~$
Dernière modification par MicP (Le 19/04/2018, à 21:09)
Hors ligne
#20 Le 20/04/2018, à 07:07
- Compte supprimé
Re : ptit gestionnaire de script.sh pour me faire la main
Merci
#21 Le 20/04/2018, à 10:48
- MicP
Re : ptit gestionnaire de script.sh pour me faire la main
Bonjour
On peut aussi remplacer :
$COLUMNS
par:
$(tput cols)
donc :
printf 'ᐁᐃ%.s' $( seq $(( $(tput cols) / 2 )) )
Dernière modification par MicP (Le 21/04/2018, à 07:51)
Hors ligne