Etude de l'utilisation de jq pour initialiser un tableau bash.
Une occasion de voir des aspects bash et jq.
Le code de départ
function select_template_v1 {
local -a list=()
list+=( "none" "No autoheader (empty)" on )
list+=( "atelier" "Header for: atelier" off )
list+=( "bureautique" "Header for: bureautique" off )
list+=( "comprendre" "Header for: comprendre" off )
list+=( "linux-mint" "Header for: linux-mint" off )
list+=( "raspberry" "Header for: raspberry" off )
list+=( "technologies" "Header for: technologies" off )
list+=( "sciences" "Header for: sciences" off )
whiptail --radiolist 'Select template' 15 80 5 "${list[@]}" 3>&1 1>&2 2>&3 || return $?
}
- ✅
local -a list=()
- Création de la variable list comme un tableau vide. - ☑️
local list=()
- Cet syntaxe bien qu'incomplète, fonction pour des raisons historique. - ❌
local -a list=
- Ecriture fausse, puisque cela initialise le tableau avec une première entrée avec une chaîne vide. -
list+=( "none" "No autoheader (empty)" on )
- Ajoute 3 entrées dans le tableau, ici les chaînes de caractères "none", "No autoheader (empty)" et "on".
Que fait '3>&1 1>&2 2>&3' dans un script ?
Les nombres sont des descripteurs de fichiers et seuls les trois premiers (commençant par zéro) ont une signification normalisée :
0
- stdin - Entrée standard
1
- stdout - Sortie standard
2
- stderr - Sortie d'erreur
Ainsi, chacun de ces nombres dans votre commande fait référence à un descripteur de fichier. Vous pouvez soit rediriger un descripteur de fichier vers un fichier avec >
, soit le rediriger vers un autre descripteur de fichier avec >
.
Le 3>&1
la votre ligne de commande créera un nouveau descripteur de fichier et le redirigera vers 1
qui est la sortie standard STDOUT. Ensuite, 1>&2
va rediriger le descripteur de fichier 1
vers STDERR et 2>&3
va redirer le descripteur de fichier 2
sur la sortie 3
qui est maintenant STDOUT.
En résumé, cela échange STDOUT et STDERR.
Maintenant, si le programme imprime quelque chose sur le descripteur de fichier 1, il sera imprimé sur le descripteur de fichier 2 et vice versa.
Contenu
Imaginons le fichier data.json suivant:
[
{"tag":"none", "item": "No autoheader (empty)", "status": true },
{"tag":"atelier", "item": "Header for: atelier", "status": false },
{"tag":"bureautique", "item": "Header for: bureautique", "status": false },
{"tag":"comprendre", "item": "Header for: comprendre", "status": false },
{"tag":"linux-mint", "item": "Header for: linux-mint", "status": false },
{"tag":"raspberry", "item": "Header for: raspberry", "status": false },
{"tag":"technologies", "item": "Header for: technologies", "status": false },
{"tag":"sciences", "item": "Header for: sciences", "status": false }
]
function select_template_v2 {
local -r jsonfile='data.json'
local -a list=()
mapfile -d $'\t' -t list < <(
jq -r \
'map( . + {"status": (if .status then "on" else "off" end)} | to_entries ) | map( .[].value ) | @tsv' \
"${jsonfile}"
) || return $?
whiptail --radiolist 'Select template' 15 80 5 "${list[@]}" 3>&1 1>&2 2>&3 || return $?
}
function select_template_v3 {
local -r json='[{"tag":"none","item":"No autoheader (empty)","status":true},{"tag":"atelier","item":"Header for: atelier","status":false},{"tag":"bureautique","item":"Header for: bureautique","status":false},{"tag":"comprendre","item":"Header for: comprendre","status":false},{"tag":"linux-mint","item":"Header for: linux-mint","status":false},{"tag":"raspberry","item":"Header for: raspberry","status":false},{"tag":"technologies","item":"Header for: technologies","status":false},{"tag":"sciences","item":"Header for: sciences","status":false}]'
local -a list=()
mapfile -d $'\t' -t list < <(
jq -r \
'map( . + {"status": (if .status then "on" else "off" end)} | to_entries ) | map( .[].value ) | @tsv' \
<<<"${json}"
) || return $?
whiptail --radiolist 'Select template' 15 80 5 "${list[@]}" 3>&1 1>&2 2>&3 || return $?
}
Liens
- La FAQ de jq en anglais,
- Le manuel de jq en anglais (Vous pouvez choisir la version de jq).
ᦿ