Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/03/2018, à 10:17

pseudofab

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

# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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

wink

Hors ligne

#3 Le 26/03/2018, à 11:38

pseudofab

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 ... smile


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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

pseudofab

Re : ptit gestionnaire de script.sh pour me faire la main

Bonjour,
voilà... C'est beaucoup mieux ainsi wink
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

# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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

pseudofab

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 pseudofab (Le 29/03/2018, à 15:31)


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#8 Le 30/03/2018, à 09:49

pseudofab

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 ...


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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

pseudofab

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

	

# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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 lol

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 cool )

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 !


eval, c'est mal.

Hors ligne

#13 Le 18/04/2018, à 17:46

pseudofab

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 wink
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 pseudofab (Le 18/04/2018, à 17:49)


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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)


eval, c'est mal.

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 wink

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

smile
corrigé,
merci.


eval, c'est mal.

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

pseudofab

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  ..


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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

dans le lien ci-dessus, printf a écrit :


.        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

pseudofab

Re : ptit gestionnaire de script.sh pour me faire la main

Merci wink


# Là pour le plaisir de découvrir . En souvenir de l'ado dont les yeux brillaient d'émerveillement devant l'écran d'un Amstrad 6128 ...

# Débutant en tout ...  je me régale !

Hors ligne

#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