Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 22/02/2010, à 16:43

wido

[bash]Script commande: option usage [résolu]

Bonjour,

Je recherche des exemples de script ce basant sur cette exemple:

$sh script
Version 0.01
Usage: script --wallpaper [Dossier] #analyse la totalité du dossier et crée un fichier database (.db)
                   --database [Fichier] #Lis le fichier .db pour afficher une image avec feh.
                   --autre option à définir par la suite
     
le problème que j'ai c'est pour intégrer la partie option:

sh script --wallpaper /mondossier/images/
sh script --database /mondossier/images/images.db

comment je crée ça?

Dernière modification par wido (Le 25/02/2010, à 00:14)

Hors ligne

#2 Le 22/02/2010, à 17:39

Totor

Re : [bash]Script commande: option usage [résolu]

Bonjour,

Je suis pas certain d'avoir compris ton besoin.
Je suppose que tu souhaites trouver une solution afin de déterminer si les options --wallpaper ou --database ont été positionnées.
Si c'est le cas, voilà comment je ferais :

while getopts :-: option
do
  case ${option} in
    -) case $OPTARG in
        -wallpaper) ...;;
        -database) ... ;;
        *) ...;;
       esac;;

    :) echo "Argument manquant pour l'option ${OPTARG}.";;

    ?) echo "Option non valide : ${OPTARG}.";;
  esac
done
shift $((OPTIND-1))

Note : j'ai pas testé


-- Lucid Lynx --

Hors ligne

#3 Le 22/02/2010, à 18:15

wido

Re : [bash]Script commande: option usage [résolu]

j'avais trouvé dans le même style:

while getopts "vh-:" opt ; do
	if [ $opt = "-" ] ; then
		case $OPTARG in
			help ) opt="h" ;;
			version ) opt="v" ;;
			* ) echo "option longue inconnue..." ;;
		esac
	fi
	case $opt in
		h ) echo "help...."
        print_info"
        ;;
		v ) echo "version..." 
        echo "$VERSION"
        ;;
		? ) echo "option inconnue" 
        ;;
	esac
done

Hors ligne

#4 Le 22/02/2010, à 18:29

sputnick

Re : [bash]Script commande: option usage [résolu]

Pour les options longue je source ce script ^^

http://sputnick-area.net/ftp/downloads/getopts_long.sh

http://sputnick-area.net/ftp/downloads/getopts_long_example.sh


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#5 Le 22/02/2010, à 18:57

wido

Re : [bash]Script commande: option usage [résolu]

Merci à vous deux, j'ai déjà du mal à coder, les exemples que tu donnes sputnick ne sont pas pour moi, beaucoup trop compliqué lol

je passerai le sujet en résolu quand je n'aurais plus de question, en deux trois mots, le script permettra d'analyser un dossier image pour qu'il affiche uniquement les images aux résolutions de l'écran comme ça on n'a pas de pixel qui se balade.

Dernière modification par wido (Le 22/02/2010, à 18:59)

Hors ligne

#6 Le 25/02/2010, à 00:13

wido

Re : [bash]Script commande: option usage [résolu]

Voici mon script:

#!/bin/bash
#set -x

AUTEUR="Wido <widomaker2k7 gmail.com>"
VERSION="0.1"
LICENCE="GPL"
file=$2

. ./swall.conf # Lecture du fichier de configuration

# # # # # # # # # # # # # # # # #
#   __Couleurs__ 
# # # # # # # # # # # # # # # # #
msgR () { # rouge
	local mesg=$1; shift
	printf "${_RG}==>${_FN} ${_BN}${mesg}${_FN}\n" "$@" >&2
}

msgV () { # vert
	local mesg=$1; shift
	printf "${_VR}==>${_FN} ${_BN}${mesg}${_FN}\n" "$@" >&2
}

msgJ () { # jaune
	local mesg=$1; shift
	printf "${_JN}==>${_FN} ${_BN}${mesg}${_FN}\n" "$@" >&2
}

msgB () { # bleu
	local mesg=$1; shift
	printf "${_BL}==>${_FN} ${_BN}${mesg}${_FN}\n" "$@" >&2
}

# Analyse le dossier image pour en sortir un fichier .db
wallpaper() {
    if [ -f "$file" ]; then
        echo "C'est un fichier"

    elif [ -d "$file" ]; then

        echo "c'est un dossier"
        create_database

    else

        echo "le fichier ou dossier n'existe pas"
        exit 1

    fi

}

lockfile() {
if [ -e $LOCKFILE ]
 
then
   echo "Actuellement $0 tourne."
   exit 1

   else
       echo $! > $LOCKFILE
fi
}

resetlockfile() {

if [ -e $LOCKFILE ]
 
then
   # Read PID from lock file
   read MYAPP_PID < $LOCKFILE
 
   # Kill MyApplication by sending a SIGTERM signal
   $(kill $MYAPP_PID &> /dev/null)
   echo "MyApplication stopped."
 
   # Remove obsolete lock file and exit
   rm $LOCKFILE
else
   echo "MyApplication is not running."
fi

}

dependance() {
if [ -x "/usr/bin/identify" ]; then

# Vérification de imagemagick
        vLONGUEUR=$(($LONGUEUR -1))
        vHAUTEUR=$(($HAUTEUR -1))
        WIDTH=`identify -format "%w" "$ligne"`
        HEIGHT=`identify -format "%h" "$ligne"`

    elif [ -x "/usr/bin/feh" ]; then
        vLONGUEUR=$(($LONGUEUR -1))
        vHAUTEUR=$(($HAUTEUR -1))
        WIDTH=`feh -l "$ligne" | grep 1 | awk '{print $3}'`
        HEIGHT=`feh -l "$ligne" | grep 1 | awk '{print $4}'`
    else
# Sinon on quitte le script
echo "Ni feh ni imagemagick ne sont installés"
    exit 1
fi
}

# Creation du fichier temporaire ( par defaut: temporaire=/tmp/wallpaper.log ).
create_temporaire() {
    if [ -f "$temporaire" ]; then
        msgR "Suppression des anciens fichiers temporaires"
        rm "/tmp/wallpaper.bak"
        rm "/tmp/wallpaper.bak2"
        msgJ "creation du fichier $temporaire"
        mv "$temporaire" "/tmp/wallpaper.bak"

        # Creation un log recensant toutes les images contenues dans le dossier.
        find "$file" -type f -name '*.jpg' -o -name '*.png' >> "/tmp/wallpaper.bak2"
        cat "/tmp/wallpaper.bak" "/tmp/wallpaper.bak2" | sort | uniq > $temporaire

    else

        find "$file" -type f -name '*.jpg' -o -name '*.png' >> "$temporaire"

    fi
}

create_database() {
if [ ! -f "$temporaire" ]; then
create_temporaire

else

 while read ligne
    do
        dependance # test du dimensionnement: feh ou imagemagick

        if [ "$WIDTH" -gt "$vLONGUEUR" ] && [ "$HEIGHT" -gt "$vHAUTEUR" ]; then

            sleep 1
            echo "$ligne" >> "$temporaire2" # image ajoutée
            msgV "$ligne add"
            cat "$temporaire2" | sort | uniq > "$file/$nom_database.db"

        else
            msgJ "$ligne non ajouté à $file/$nom_database.db"
        fi
    done < $temporaire

fi
resetlockfile
}

#Affiche les images contenus dans le fichier .db au format de l'écran.
database() {
    if [ -f "$file" ]; then
        echo "image: $file"

        while true;
        do
            IMAGE=`cat "$file" | shuf -n 1`
            feh --bg-scale "$IMAGE" #afficher l'image avec feh
            sleep $temps
        done &

    elif [ -d "$file" ]; then
        msgJ "c'est un dossier"
        print_info
    else
        msgJ "le fichier ou dossier n'existe pas"
        resetlockfile
        exit 1
    fi
}

print_info() {
	cat <<- EOF

		swall script qui affiche les images ayant la même résolution que votre écran.

		Usage: $0 [option] <package> [...]

        Options: -h, --help                 Show this help
                 -v, --version              Print version

                 -d, --database <fichier>   Afficher les images contenues
                                            dans le fichier au format db.

                 -w, --wallpaper <dossier>  Analyse le dossier image 
                                            pour creer un fichier au format db.

        Paramètres à modifier: $0.conf
                                            Taille de l'écran: "$LONGUEUR x $LONGUEUR"
                                            nom de la base de données: "$nom_database"
                                            temporisation: "$temps"

	EOF
    resetlockfile
	exit $1
}

while getopts "vh-:vhw-:vhd-:" opt ; do
	if [ $opt = "-" ] ; then
		case $OPTARG in
			help ) opt="h" ;;
			version ) opt="v" ;;
            wallpaper ) opt="w" ;;
            database ) opt="d" ;;
			* ) echo "option inconnue..." ;;
		esac
	fi
	case $opt in
		h )
        lockfile

        print_info
        ;;
		v )
        lockfile
        clear
        echo "Version: $VERSION $AUTEUR"
        echo "Licence: $LICENCE"
        ;;
        d )
        lockfile
        database
        ;;
        w )
        lockfile
        wallpaper
        ;;
		? ) msgJ "option inconnue" 
        ;;
	esac
done
OPTS="${@}"

swall.conf:

# Nom de la base de données (defaut: database)
nom_database="image.db"
# temporisation entre deux images (defaut: 15m)
temps=15m
# Longueur de la taille de l'écran (defaut 1280)
LONGUEUR=1280
# Largeur de la taille de l'écran (defaut 1024)
HAUTEUR=1024

# fichier temporaire (ne pas modifier):
temporaire="/tmp/wallpaper.log"
temporaire2="/tmp/wallpaper2.log"
LOCKFILE=/tmp/swall.lock

il y a peut-être des choses à modifier.

Dernière modification par wido (Le 25/02/2010, à 01:02)

Hors ligne

#7 Le 25/02/2010, à 00:42

sputnick

Re : [bash]Script commande: option usage [résolu]

Je me sent pas de tout lire, mais deja ça ca va pas :
kill -15 $MYAPP_PID 2>&1 > /dev/null
-15 c'est deja le cas sans option.
la redirection correcte, c'est :
> /dev/null 2>&1
ou alors
&> /dev/null
la derniere solution est un bashism donc non POSIX.
Donc au final :
kill $MYAPP_PID &> /dev/null


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#8 Le 25/02/2010, à 01:03

wido

Re : [bash]Script commande: option usage [résolu]

j'avais vu ça sur un blog hmm
et merci pour la modif big_smile

Hors ligne

Haut de page ↑