#1 Le 28/12/2015, à 17:49
- crocefisso
Itérer une variable à partir d'un fichier dans shell
Bonjour à tous, et joyeuses fêtes,
J'ai écrit un script qui génère un fichier contenant une commande curl (cv.text). Cette commande contient une variable appellée $v. Le but est de lancer la commande pour $v=1, $v=26, $v=51, ..., $v=k, et d'enregistrer chaque output dans des fichiers json appelés r1.json, r2.json,...,r$kdr.json. où kdr=k/25 et k est nombre total de résultats fournis par la commande curl.
Ma question est, comment faire une itération à partir d'une variable ($v) qui est mentionnée dans un fichier (cv.txt) ?
Voici le code :
#!/bin/bash
echo -e "curl --get --include 'https://...start=1...' \\
-H "..." \\
-H "..." > c.txt
source c.txt | grep -A10000 "{" > r0.json
k=$(jq <"r0.json" '.totalResults')
kdr=$(echo $(($k / $(jq <"r0.json" '.radius'))))
sed <c.txt "s/start=1/start=$v/g" > cv.txt
for ((v=1,w=1;v<=k,w<=kdr;v+=25,w++))
do source c$v.txt > r"$w".json
done
Mon problème est qu'au lieu de générer r1.json contenant les résultats 1 à 25, r2.json contenant les résultats 26 à 51, etc. le script génère r1.json contenant les résultats 1 à 25, r2.json contenant les résultats 1 à 25, etc.
Dernière modification par crocefisso (Le 30/12/2015, à 19:29)
Hors ligne
#2 Le 28/12/2015, à 18:34
- dva2tlse
Re : Itérer une variable à partir d'un fichier dans shell
Bonsoir Crocefisso,
je n'ai pas tout lu, j'ai été dégoutè dès que j'ai vu tes boucles C-like. Il est plus simple à mon avis d'utiliser seq. (vois man seq)
NAME
seq - print a sequence of numbers
SYNOPSIS
seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
HTH,
David
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#3 Le 28/12/2015, à 21:16
- Watael
Re : Itérer une variable à partir d'un fichier dans shell
salut,
attention, /bin/sh n'est pas forcément /bin/bash !
$ v=12 # par exemple
$ for ((;v<=15;v++)) # on peut laisser vide, ou ajouter v=$v
> do
> echo $v
< done
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 28/12/2015, à 21:29
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
Bonsoir Watael, je voulais mettre shell dans le titre, mais il n'y avait pas assez de place...
Dernière modification par crocefisso (Le 30/12/2015, à 19:03)
Hors ligne
#5 Le 28/12/2015, à 21:56
- Hizoka
Re : Itérer une variable à partir d'un fichier dans shell
bah tu la recupere ta variable... utilise sed si tu veux ou lis le fichier avec une boucle... ou encore grep...
et apres tu fais la boucle que t'indique Watael
à quoi ressemble ton fichier txt ?
en fait c'est pas franchement clair ce que tu veux faire, peux tu detailler exactement ce que tu veux en donnant un exemple concret ?
Dernière modification par Hizoka (Le 28/12/2015, à 21:58)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 28/12/2015, à 22:07
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
Mon problème vient du fait que ma boucle
do source cv.txt
ne prend pas en compte la variable $v qui est dans cv.txt.
Dernière modification par crocefisso (Le 30/12/2015, à 19:04)
Hors ligne
#7 Le 28/12/2015, à 22:14
- Watael
Re : Itérer une variable à partir d'un fichier dans shell
je n'ai peut-être pas bien lu, mais il me semble que le fichier est sourcé dans le script; la variable est donc disponible dans le script.
quant au shell, source n'est pas une commande POSIX, pas plus que le boucle for arithmétique.
ton script ne fonctionnera donc pas si le shell n'est pas bash.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 28/12/2015, à 22:20
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
Le script crée un fichier cv.txt situé dans le dossier depuis lequel la commande qui lance le script est lancée. Oui, je suis au courant que la syntaxe ((v=1,w=1;v<=k,w<=kdr;v+=25,w++)) ne marche que sous bash.
Dernière modification par crocefisso (Le 30/12/2015, à 19:06)
Hors ligne
#9 Le 28/12/2015, à 22:51
- Watael
Re : Itérer une variable à partir d'un fichier dans shell
oh, elle va se calmer avant que je la blacklist !
si elle mettait pas ses petites variables à la fin d'une trèèèèèèèèèèèèèèèèèès longue commande, on y verrait un peu plus clair.
Le but est de lancer la commande pour $v=1, $v=26, $v=51, ..., $v=k,
pas de problème, tu mets ta commande curl dans la boucle où tu incrémentes v de 25 en 25
for ((v=1;v<=k_mais-k-est-inconnue;v=+25)); do curl ...start=$((++x))&v=$v >r$x.json; done
.
et d'enregistrer chaque output dans des fichiers json appelés r1.json, r2.json,...,r$kdr.json. où kdr=k/25
c'est pas compliqué, tu incrémentes une autre variable de 1 en 1.
c'est d'ailleurs ce que fait ta bloucle.
et k est nombre total de résultats fournis par la commande curl.
là ? comment connnais-tu ce nombre ?
Dernière modification par Watael (Le 28/12/2015, à 23:08)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 29/12/2015, à 08:31
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
k=$(jq <"r0.json" '.totalResults')
Hors ligne
#11 Le 29/12/2015, à 15:18
- Compte anonymisé
Re : Itérer une variable à partir d'un fichier dans shell
je propose ce script qui à l'air de faire ce que vous souhaitez
#!/bin/sh
url="https://indeed-indeed.p.mashape.com/apisearch?publisher=6935097635631519&callback=<required>&chnl=<required>&co=<required>&filter=<required>&format=json&fromage=<required>&highlight=<required>&jt=<required>&l=austin%2C+tx&latlong=<required>&limit=<required>&q=java&radius=25&sort=<required>&st=<required>&useragent=<required>&userip=<required>&v=2&start=$v"
curl --get --include "$url" -H "X-Mashape-Key: ZqCFOOdclvmsh1yvyjd7NFgPUjkQp1Qy7syjsnLw6elHJktBIM" -H "Accept: application/json"|grep -A10000 "{" > r0.json
k=$(jq ".totalResults" "r0.json")
i=1
while [ "$i" -lt "$k" ]
do
curl --get --include "$url"$i -H "X-Mashape-Key: ZqCFOOdclvmsh1yvyjd7NFgPUjkQp1Qy7syjsnLw6elHJktBIM" -H "Accept: application/json" > r"$i".json
i=$(expr $i + 25)
done
#12 Le 29/12/2015, à 16:05
- Watael
Re : Itérer une variable à partir d'un fichier dans shell
expr n'est vraiment pas indispensable : le shell sait faire "un peu" d'arithmétique, sans recours à une commande externe.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 29/12/2015, à 16:08
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
@Anonyme68 Excellent ! Merci! La soultion que j'avais trouvé était trop lourde...
# loop 1
#for ((v=1;v<=k;v+=25))
#do sed <c.txt "s/start=1/start=$v/g" > c$v.txt
#done
# loop 2
#for ((v=1,w=1;v<=k,w<=kdr;v+=25,w++))
#do source c$v.txt > r"$w"temp.json
#done
# loop 3
#for ((w=1;w<=kdr;w++))
#do grep -A10000 "{" r"$w"temp.json > r"$w".json
#done
Ceci dit, est-il possible de nommer les résultats finaux r1.json, r2.sjon etc. Au lieu de r1.json, r26.json, etc.
Sinon, par rapport à la question initiale, c'est vraiment pas jouable de manipuler des variables depuis un autre fichier ?
Dernière modification par crocefisso (Le 29/12/2015, à 16:14)
Hors ligne
#14 Le 29/12/2015, à 17:21
- Compte anonymisé
Re : Itérer une variable à partir d'un fichier dans shell
Ceci dit, est-il possible de nommer les résultats finaux r1.json, r2.sjon etc. Au lieu de r1.json, r26.json, etc.
oui, quelque chose comme ça :
#!/bin/sh
url="https://indeed-indeed.p.mashape.com/apisearch?publisher=6935097635631519&callback=<required>&chnl=<required>&co=<required>&filter=<required>&format=json&fromage=<required>&highlight=<required>&jt=<required>&l=austin%2C+tx&latlong=<required>&limit=<required>&q=java&radius=25&sort=<required>&st=<required>&useragent=<required>&userip=<required>&v=2&start=$v"
curl --get --include "$url" -H "X-Mashape-Key: ZqCFOOdclvmsh1yvyjd7NFgPUjkQp1Qy7syjsnLw6elHJktBIM" -H "Accept: application/json"|grep -A10000 "{" > r0.json
k=$(jq ".totalResults" "r0.json")
i=1
j=1
while [ "$i" -lt "$k" ]
do
curl --get --include "$url"$i -H "X-Mashape-Key: ZqCFOOdclvmsh1yvyjd7NFgPUjkQp1Qy7syjsnLw6elHJktBIM" -H "Accept: application/json" > r"$j".json
i=$(expr $i + 25)
j++
done
Sinon, par rapport à la question initiale, c'est vraiment pas jouable de manipuler des variables depuis un autre fichier ?
tu as un fichier cv.txt avec une variable $v que tu exécutes avec source cv.txt, je te propose une approche différente :
tu remplaces $v par $1 dans cv.txt et tu exécutes par :
sh cv.txt $v
$1 sera remplacé par le premier argument de la commande soit $v
Dernière modification par Compte anonymisé (Le 29/12/2015, à 17:23)
#15 Le 29/12/2015, à 17:36
- Compte anonymisé
Re : Itérer une variable à partir d'un fichier dans shell
@Watael :
en effet on peut remplacer
i=$(expr $i + 25)
par
i=$(($i + 25))
#16 Le 30/12/2015, à 09:18
- credenhill
Re : Itérer une variable à partir d'un fichier dans shell
hello
et aussi
$ i=25
$ ((i+=25))
$ echo $i
50
Hors ligne
#17 Le 30/12/2015, à 19:26
- crocefisso
Re : Itérer une variable à partir d'un fichier dans shell
@Anonyme68 Merci beaucoup!!! j'ai repris des éléments de ta solution en faisant :
#!/bin/bash
url="https:/...&start="
curl --get --include "$url"1 -H "..." -H "..." | grep -A10000 "{" > r0.json
k=$(jq <"r0.json" '.totalResults')
kdr=$(echo $(($k / $(jq <"r0.json" '.radius'))))
for ((v=1,w=1;v<=k,w<=kdr;v+=25,w++))
do curl --get --include "$url"$v -H "..." -H "..." |grep -A10000 "{" > r"$w".json
done
C'est la solution idéale ici, parce qu'on peut déplacer "start=", mais j'imagine que dans certains cas, aller taper dans un fichier serait beaucoup mieux. C'est pourquoi je me demandais si c'était possible.
Dernière modification par crocefisso (Le 30/12/2015, à 19:28)
Hors ligne