2017-05-31 1 views
3

Comment puis-je obtenir le produit d'un numéro 1 dans bash? (12345> 1x2x3x4x5)Produit d'un chiffre avec un script shell

J'essaie d'obtenir un script pour faire de la multiplication, j'ai essayé d'échapper au * char mais pas de chance, j'ai aussi essayé de bidouiller avec expr.

echo -n "Enter number " 
read n 

len=$(echo $n | wc -c) 

len=$(($len - 1)) 

for ((i=1; i <= $len; i++)) 
do 
    prod=$(($prod \* $(echo $n | cut -c $i))) 
done 
echo "Product of $n is $prod" 
+1

Les règles d'analyse changent dans '$ ((...))'; vous n'avez pas besoin d'échapper le '*', car aucune extension de chemin n'est effectuée. – chepner

+0

Merci les gars! J'ai également réussi à le résoudre en simplifiant la boucle for à 'prod = $ ((prod * $ (echo $ n | couper -c $ i)))' et en définissant une valeur à prod. –

Répondre

2

Vous pouvez obtenir la longueur d'une chaîne à partir de l'expansion des paramètres, sans avoir besoin d'appeler des outils externes.

#!/bin/bash 
read -p 'Enter number: ' n 

product=1 
for ((i=0; i < ${#n}; ++i)) ; do 
    d=${n:i:1} 
    ((product *= d)) 
done 
printf '%d\n' $product 

Et, pour le plaisir, en utilisant Perl:

perl -MList::Util=product -le 'print product(split //, shift)' -- "$n" 
1

gawk solution (GNU awk):

echo 12345 | awk -v FPAT="[0-9]" '{ r=$1; for(i=2;i<=NF;i++) r=r*$i }END{ print r }' 

La sortie:

120 

  • FPAT="[0-9]" - représente valeur de champ pour que chaque champ contienne un chiffre
+0

Mon erreur. Merci pour la confirmation. –

1

Comme je l'ai compris que vous voulez obtenir la valeur de la multiplication des chiffres en nombre

Supposons que vous ayez le numéro:

number=12345 

Vous devez insérer * entre les chiffres:

echo $number | sed 's/\([0-9]\)/\1*/g' 

Nous aurons la chaîne:

1*2*3*4*5* 

Nous ne avons pas besoin dernières asteriks - nous allons supprimer:

echo $number | sed 's/\([0-9]\)/\1*/g' | sed 's/.$//g' 

Nous allons obtenir ceci:

1*2*3*4*5 

On peut maintenant le rediriger vers calc:

echo $number | sed 's/\([0-9]\)/\1*/g' | sed 's/.$//g' | calc -p 

STDOUT Il est:

120 
1

\* ne va pas dans une expression arithmétique, il devrait être * seul.Mais même en cours d'exécution alors votre code donne:

$ bash product.sh 
Enter number 12 
product.sh: line 10: * 1 : syntax error: operand expected (error token is "* 1 ") 
Product of 12 is 

La raison de l'erreur est cette variable $prod n'est pas définie à une valeur initiale avant il est étendu à une valeur vide, par exemple essayer dans votre terminal:

$ echo $prod 

$ 

Dans votre script, vous devez définir prod à une valeur initiale avant d'utiliser pour la première fois. Il devrait être:

echo -n "Enter number " 
read n 

len=$(echo $n | wc -c) 

len=$(($len - 1)) 

prod=1 

for ((i=1; i <= $len; i++)) 
do 
    prod=$(($prod * $(echo $n | cut -c $i))) 
done 
echo "Product of $n is $prod" 

Il y a quelques problèmes avec votre code:

  • toujours mettre un shebang line en haut
  • toujours double quote les variables
  • utilisant $ sur les variables ne sont pas nécessaire dans les expressions arithmétiques en Bash