Bonjour,
Je ne sais pas si ce type de post a déjà été traité si c’est le cas veuillez m’excuser du doublon.
Voila, ce que je voudrais faire c’est de rajouter un espace entre deux caractères que voici: '[]'
Sous forme de boucle:
Ex:
chaine='[]'
for i in `seq 1 100`
do
[ ] # 1ere boucle
[ ]# 2eme boucle
[ ]# 3eme boucle
[100 espaces] # 100eme boucle
done
Merci d’avance pour vos réponses
EDIT:
chaine='[]'
space=' '
for i in `seq 1 100`
do
sleep 1
echo -ne "\033[$()G"
space+=" "
echo -ne $chaine| sed "s/./&$space/g"
done
Avec ce code ca rajoute bien un espace a chaque tour de boucle le soucis c’est que ca en rajoute un a la fin du “]”
comment faire pour retirer les espaces a la fin ?
Pas certain d’avoir compris mais… sortir l’artillerie sed n’est peut-être pas nécessaire.
Est-ce que cette boucle fait le boulot ?
for i in `seq 1 100`
do
space="$space"_
echo \["$space"\]
done
Edit: bon réflexion faite je pense que tu veux conserver la chaîne définie avant, et que tu ne peux pas l’éclater manuellement comme je le propose…
Edit2: de la triche d’utiliser $chaine[1] $chaine[2] pour ne sortir que le 1er et 2nd caractère ?
Bonjour, merci pour vos réponses!
Effectivement je souhaite conserver la chaine de départ.
C’est a dire que l’espace entres les deux [] augmente toute les secondes.
Sur la même ligne.
Misterfreez:
Les deux codes que tu m’as donnés ne fonctionnent pas
cela me renvoie rien. le script se ferme a l’instant ou je le lance…
Même en mettant le -x au début il m’affiche rien
Bonjour, merci pour vos réponses!
Effectivement je souhaite conserver la chaine de départ.
C’est a dire que l’espace entres les deux [] augmente toute les secondes.
Sur la même ligne.
[quote=“MisterFreez”]for i in seq 1 100 ; do
v=$(echo “$v” | sed ‘s/[([ ]*)]/[ \1]/’)
done[/quote]
[quote=“MisterFreez”]for i in seq 1 100 ; do
v=$(sed ‘s/[([ ]*)]/[ \1]/’ <<< “$v”)
done[/quote]
Les deux codes que tu m’as donnés ne fonctionnent pas
cela me renvoie rien. le script se ferme a l’instant ou je le lance…
Même en mettant le -x au début il m’affiche rien
Je viens de trouver une solution,que dit tu de ceci ?
chaineZ='[]'
space=''
for i in `seq 1 100`
do
sleep 1
echo -ne "\033[$()G"
space+=" "
echo -ne $chaineZ| sed "s/./&$space/"|sed -re 'y/ /=/'
done
A la fin je remplace l’espace par un ‘=’ pour simuler une barre de progression.
Par contre j’ai plusieurs questions:
Est ce possible de mettre une fin de progression par rapport a la fenêtre?
Ex: quand le ‘]’ arrive au bout de la fenêtre il stoppe la progression.
Dans mon code j’ai fait une fonction timmer:
timmer() {
for compteur in $(seq 1 3600)
do
sleep 1
echo -ne "\033[$()G"
if [ $compteur -gt 59 ]
then
let min=compteur/60 # division entière
let sec=compteur%60 # reste ou modulo
echo -n "$min:$sec "
else echo -n "$compteur "
fi
done
}
Est possible de combiner les deux affichage ?
Ex: le timmer a gauche de l’écran et la progression a droite.
Pourquoi tu crée des espaces si c’est pour les remplacer par des « = » ?
bar='===================================================================================================='
for i in {0..100}
do
sleep 1
echo -ne "\033[$()G"
printf "[%s]" "${bar:0:$i}"
done
Si ta chaine est vraiment celle que tu nous montre pourquoi s’embêter à la parser ?
Si c’est juste un exemple, il faut découper la chaine une fois, pour séparer le début de la fin et reconstruire la chaine à chaque itération.
Tu voudrait dès le départ que [ et ] soient écartés de 100 ?
bar='===================================================================================================='
empty="${bar//=/ }"
for i in {0..100}
do
sleep 1
echo -ne "\033[$()G"
printf "[%s%s]" "${bar:0:$i}" "${empty:0:100-$i}"
done
Je n’avais pas pensé a cette solution, mais oui ce serait bien.
J’ai testé ton code mais cela ne m’affiche pas tout sur une ligne.
voila le résultat:
[
[=
[==
[===
[====
]
Peut être un problème sur la taille de la fenêtre ?
Edit: c’est bien un problème de fenêtre quand la fenêtre est trop petite cela me renvoie ce que je t’ai mis plus haut.
Dans ce cas serait-il possible de ne plus faire de 0 a 100 mais du début de la fenêtre a la fin ?
Edit2: Grace a la commande tput cols je peux savoir le nombre de colonnes que comporte la sortie écran et donc en déduire la fin.
fin=$(tput cols)
test=$(($fin-2))
bar='===================================================================================================='
empty="${bar//=/ }"
for i in $(seq 0 $test)
do
sleep 1
echo -ne "\033[$()G"
printf "[%s%s]" "${bar:0:$i}" "${empty:0:$test-$i}"
done
Ce qui m’amène a ma deuxième question comment je peux faire pour combiner la progression et le timmer…
Ce qui me dérange le plus c’est de savoir ou placer dans le code l’appel a la fonction du timmer.
Juste pour dire : si c’est pour afficher une barre de progression, pourquoi réintenter la roue alors qu’il existe des outils éprouvés tels que [mono]dialog[/mono]?
Ceci étant si c’est pour travailler son shell, je comprends
test=$(($COLUMNS-2))
bar='===================================================================================================='
empty="${bar//=/ }"
for i in {0..$test}
do
sleep 1
echo -ne "\033[$()G"
printf "[%s%s]" "${bar:0:$i}" "${empty:0:$test-$i}"
done
Tu peut créer une fonction ainsi :
function progress() {
local test=$(($COLUMNS-2))
local bar='=============================================================================================================='
local empty="${bar//=/ }"
progress=${1:-$(($progress+10))}
echo -ne "\033[$()G"
printf "[%s%s]" "${progress:0:$i}" "${empty:0:$test-$i}"
}
Ensuite à chaque fois que tu veux faire avancer la barre de progression :
[code]# Action 1
progress 5 # on passe la barre à 5%
Action 2
progress # on passe la barre à 15 %[/code]
Par contre il ne faut rien écrire d’autre sur la sortie standard.
@agentsteel> Je connais mal dialog. C’est peut être très bien, mais c’est une dépendance pas forcément nécessaire du moins si c’est juste pour faire attendre 100s. J’ai regardé vite fait, peut être que le mixedgauge pourrait le faire, mais vite fait j’ai pas bien compris comment ça fonctionne (et j’aime pas les interfaces curses).
printf "[%s%s]" "${progress:0:$i}" "${empty:0:$test-$i}"
[/quote]
Hum tu le lance bien avec bash ?
Au pire, il faut faire le calcul avant et passer le résultat à la place de l’opération.
[quote=“jjbond”]Si je peux me permettre, tu fait appel à ‘$COLUMNS’ mais je ne le vois pas déclaré.
Est ce une variable d’environnement ?[/quote]
Non c’est une variable que bash crée au moment où tu t’en sert (c’est légèrement différent).
Sauf erreur de ma part il n’y a pas de boucle dans la fonction l’appel a $i est peut etre la raison de l’erreur ?
L’erreur: /barre.sh: line 26: empty: -2-: erreur de syntaxe : opérande attendue (error token is "-")
[quote=“MisterFreez”]
@agentsteel> Je connais mal dialog. C’est peut être très bien, mais c’est une dépendance pas forcément nécessaire du moins si c’est juste pour faire attendre 100s. J’ai regardé vite fait, peut être que le mixedgauge pourrait le faire, mais vite fait j’ai pas bien compris comment ça fonctionne (et j’aime pas les interfaces curses).[/quote]
je ne connais pas bien non plus mais il y a des exemple dans /usr/share/doc/dialog/examples
cd /usr/share/doc/dialog/examples
sh gauge
(oui c’est du ncurses )
function progress() {
local test=$(($COLUMNS-2))
local bar='=============================================================================================================='
local empty="${bar//=/ }"
progress=${1:-$(($progress+10))}
echo -ne "\033[$()G"
printf "[%s%s]" "${progress:0:$progress}" "${empty:0:$test-$progress}"
}