J'ai un script générant 2 dialogues en chaîne et la sortie est une chaîne de 2 nombres en tant que telle: "x y". Je veux obtenir ces nombres dans des variables séparées, alors j'ai essayé d'utiliser sed:

y=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\2/')
x=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\1/')

Où $ y est la sortie des dialogues chaînés. Mon problème est que si j'essaie chaque commande dans le terminal, cela fonctionne bien et "1 2" me donne x = "1" et y = "2" mais à partir d'un script shell bash, les variables ont un espace à la fin (x = " 1 "et y =" 2 ").

echo -n "1 2" | sed 's/\([0-9]\+\) \([0-9]*\)/\2/' # Works

J'ai essayé d'utiliser tr pour supprimer l'espace sans effet. J'ai également utilisé 'echo -n' pour supprimer la nouvelle ligne de fin mais cela ne change rien. Mon objectif est de faire des opérations sur ces variables afin qu'elles ne puissent pas avoir d'espace à la fin.

J'imprime le résultat avec:

echo -e 'x:"'$x'" ,y:"'$y'"'

J'obtiens la variable x à la suite de:

x=$((dialog --clear --title title --menu Choose: 20 70 4 "1 a 2 b 3 c" \
  --and-widget --menu Choose: 20 70 4 "1 x 2 y 3 z") 2>&1)
-1
2A-66-42 29 avril 2017 à 14:57

3 réponses

Meilleure réponse
exec 3>&1
result=$( dialog --clear --title title --menu Choose: 20 70 4 1 a 2 b 3 c \
  --and-widget --menu Choose: 20 70 4 1 x 2 y 3 z  2>&1 1>&3 )
exitcode=$?
exec 3>&-
echo "result = >$result<" "exit-code = >$exitcode<"
sep=$(echo -e "\t") # define the separator
x=${result%$sep*} # remove up from separator
y=${result#*$sep} # remove up to separator

echo "Choosen: x=$x y=$y"

Voir https://askubuntu.com/questions/491509 / comment-obtenir-une-boîte-de-dialogue-entrée-dirigée-vers-une-variable pour obtenir le résultat du dialogue dans une variable. Votre code x=$(( indique un développement arithmétique, qui n'est pas correctement terminé. Voir man bash $((expression)) Pourquoi cela ne se termine pas par une erreur me dépasse. Les guillemets autour des paramètres des boîtes de dialogue donnent 5 paramètres, tandis que vous avez besoin de 4 paramètres plus une ou plusieurs paires de paramètres.

La chaîne de résultat de la boîte de dialogue semble être séparée par une tabulation. Travailler avec une expression régulière basée sur un blanc ne fonctionnerait pas.

sed n'est pas nécessaire, cela peut être fait avec (bash builtin) 'Expansion des paramètres'.

Le menu est toujours imprimé sur stdout. exec 3>&1 crée un doublon de stdout. 1>&3 dirige la sortie habituelle vers le canal 3, qui est un double de 1. La sortie normale se termine dans stdout.

2>&1 redirige stderr vers stdout qui finit comme contenu de la variable.

En cas d'erreur, le message d'erreur est dans votre variable. Une certaine gestion des erreurs est nécessaire.

Impossible de tester avec Xdialog, mais je m'attendrais à ce que cela fonctionne aussi.

1
ULick 29 avril 2017 à 20:58

Vous pouvez le faire directement en utilisant Bash:

read x y <<< "1 2"

Il supprimera les espaces et définira les variables $ x et $ y.

1
John Zwinck 29 avril 2017 à 12:02

Bien que cela ne soit pas nécessaire dans ce cas, la correspondance d'expressions régulières Bash peut offrir plus de contrôle sur l'analyse. Par exemple, vous pourriez avoir quelque chose comme ceci:

if
  [[ $output =~ ^[[:space:]]*([^[:space:]]+)[[:space:]]+([^[:space:]]+) ]]
then
  x=${BASH_REMATCH[1]}
  y=${BASH_REMATCH[2]}
else
  # No match
fi

C'est évidemment plus complexe, mais les expressions régulières peuvent souvent être utilisées pour analyser (et extraire des portions de) chaînes dont le format peut varier ou ne peut pas être géré par read en raison de leur structure.

1
Fred 29 avril 2017 à 12:47