web-dev-qa-db-fra.com

Comment définir la valeur booléenne dans la commande curl utilisée script bash

J'ai besoin de mettre en variable true/false et l'envoyer en json avec la commande curl:

name=$1
sx=$2

`curl -d '{"name":"'"$name"'", "sex":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/setacc`

La variable sx accepte la valeur male ou female comment définir la valeur booléenne appropriée dans sex variable?

2

L'utilisation d'une variable pour l'ensemble de la chaîne JSON et sa construction pièce par pièce peuvent rendre la citation moins lourde et rendre la ligne de commande curl plus lisible et plus facile à gérer, même si le code global est beaucoup plus détaillé.

La construction de la chaîne est effectuée ici à l'aide de l'opérateur de concaténation automatique de chaîne +=. Notez que dans json_string+=$name, par exemple, aucune citation n'est nécessaire car aucune division de mot n'est effectuée et aucun caractère spécial n'est présent sur le côté droit.

Vous pouvez utiliser un tableau associatif pour rechercher la valeur souhaitée en fonction de la clé fournie. Ici, j'assigne les paires individuellement. Ci-dessous, je montrerai comment les exécuter en une seule tâche.

name=$1
sx=$2

declare -A sexes
sexes[male]=false
sexes[female]=true

json_string='{"name":"'
json_string+=$name
json_string+='", "sex":'
json_string+=${sexes[$sx]}
json_string+='}'

curl -d "$json_string" " -H "Content-Type: application/json" -X POST http://localhost:8080/setacc

Vous pouvez diviser encore plus le JSON pour lui donner un aspect un peu plus structuré dans le code (le contenu de la chaîne obtenue sera toujours une chaîne à une seule ligne). Idéalement, si vous utilisez un code JSON plus complexe que celui-ci, utilisez un outil JSON spécialement conçu pour créer la structure.

Voici comment vous pouvez effectuer la déclaration et l'affectation d'un tableau associatif en une seule fois. Le premier exemple est sur une ligne et le second sur plusieurs lignes - encore une fois pour améliorer la lisibilité et la facilité de maintenance.

declare -A sexes='([female]="true" [male]="false")'

declare -A sexes='(
    [female]="true"
    [male]="false"
)'
2
Dennis Williamson

Le moyen le plus simple de mapper la chaîne male sur true ou false (selon vos besoins) et sur female avec une autre valeur est une simple clause if…then…else . Le truc est la citation, mais vous l’avez déjà obtenue avec la variable $name. Alors:

if [ "$sx" = "male" ]; then
    sex="true";     # or whatever you consider male sex to be
else
    sex="false";    # just the opposite, see above
fi

curl -d '{"name":"'"$name"'", "sex":'$sex'}' -H "Content-Type: application/json" -X POST http://localhost:8080/setacc
4
PerlDuck

Dans votre cas, vous utilisez JSON et pouvez utiliser le texte "true" et le texte "false".

Vous devez ajouter à la logique de script bash:

sex="false"
if [ "$sx" = "male" ]; then
  sex="true"
fi

puis exécutez la commande curl avec ... {"name":"'"$name"'", "sex":\"$sex\"} ... ou juste ... {"name":"'"$name"'", "sex":$sex} ...

Script de test:

#!/bin/bash

sx="male"

sex="false"
if [ "$sx" = "male" ]; then
  sex="true"
fi

echo \"$sex\"
3
mature