Contenu | Rechercher | Menus

Annonce

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 28/12/2015, à 18: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, à 20:29)

Hors ligne

#2 Le 28/12/2015, à 19: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, à 22: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, à 22: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, à 20:03)

Hors ligne

#5 Le 28/12/2015, à 22: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, à 22:58)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 28/12/2015, à 23: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, à 20:04)

Hors ligne

#7 Le 28/12/2015, à 23: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, à 23: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, à 20:06)

Hors ligne

#9 Le 28/12/2015, à 23: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 29/12/2015, à 00:08)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 29/12/2015, à 09: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, à 16: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, à 17: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, à 17: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, à 17:14)

Hors ligne

#14 Le 29/12/2015, à 18: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, à 18:23)

#15 Le 29/12/2015, à 18: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, à 10: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, à 20: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, à 20:28)

Hors ligne