Je tente d’utiliser la fonction sqrt de la commande awk dans mon script, mais tout ce qu’elle renvoie est 0. Y a-t-il un problème avec mon script ci-dessous?
echo "enter number" read root awk 'BEGIN{ print sqrt($root) }'
C’est la première fois que j’utilise la commande awk, y a-t-il des erreurs que je ne comprends pas ici?
Peut-être que tu peux essayer ça.
echo "enter number" read root echo "$root" | awk '{print sqrt($0)}'
Vous devez donner une entrée de données à awk. Donc, vous pouvez utiliser ‘echo’. L’instruction BEGIN consiste à faire des choses, comme imprimer un en-tête … etc avant que awk ne commence à lire l’entrée.
$ echo "enter number" enter number $ read root 3 $ awk -v root="$root" 'BEGIN{ print sqrt(root) }' 1.73205
Voir la FAQ comp.unix.shell pour les 2 manières correctes de transmettre la valeur d’une variable shell à un script awk.
MISE À JOUR: Ma solution proposée se révèle potentiellement dangereuse. Voir la réponse d’Ed Morton pour une meilleure solution. Je vais laisser cette réponse ici comme un avertissement.
À cause des guillemets simples, $root
est interprété par awk, pas par le shell. awk traite root
comme une variable non initialisée, dont la valeur est la chaîne vide, traitée comme 0
dans un contexte numérique. $root
est le champ root
de la ligne courante – dans ce cas, $0
, qui est la ligne entière. Comme il se trouve dans un bloc BEGIN
, il n’y a pas de ligne courante, donc $root
est la chaîne vide – qui est à nouveau traitée comme 0
lorsqu’elle est transmise à sqrt()
.
Vous pouvez le voir en changeant un peu votre ligne de commande:
$ awk 'BEGIN { print sqrt("") }' 0 $ echo 2 | awk '{ print sqrt($root) }' 1.41421
NOTE: Ce qui précède est simplement pour montrer ce qui ne va pas avec la commande originale, et comment elle est interprétée par le shell et par awk.
Une solution consiste à utiliser des guillemets plutôt que des guillemets simples. Le shell développe les références de variables entre guillemets:
$ echo "enter number" enter number $ read x 2 $ awk "BEGIN { print sqrt($x) }" # DANGEROUS 1.41421
Vous devez faire attention lorsque vous faites ce genre de chose. L’interaction entre la citation et l’expansion variable dans le shell vs awk peut être compliquée.
MISE À JOUR: En fait, vous devez être extrêmement prudent. Comme le fait remarquer Ed Morton dans un commentaire, cette méthode peut conduire à l’exécution de code arbitraire en raison d’une valeur malveillante pour $x
, ce qui constitue toujours un risque pour une valeur lue par l’utilisateur. Sa réponse évite ce problème.
(Notez que j’ai changé le nom de votre variable shell de $root
en $x
, car c’est le nombre dont vous voulez la racine carrée, pas la racine elle-même.)