Tentative d’utiliser awk sqrt mais ne renvoie que 0

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.)