2016-02-14 3 views
1

Je voulais faire une boucle for pour tous les fichiers avec le nom "r?. ???. Txt", où?. ??? était un flotteur de 0,000 à 3,999. Cependant, bash n'a pas entier, autant que je sache ... Cela se transforme en un mal de tête ...Nombre tronqué tronqué comme nom de fichier variable dans bash

J'ai essayé de faire pour fastidieux pour la boucle avec deux variables représentant les nombres avant et après décimal. Cependant, j'ai encore besoin d'insérer des zéros si vous avez? .00 ?. Par conséquent, j'ai besoin d'un traitement approprié des nombres flottants et comment les stocker/les sortir.

En résumé, il y a deux questions que je face à

  1. faire flotter dans bash
  2. sortie qui flottent comme valeur et passer dans le nom de fichier

Merci.

+0

Quel est le problème avec la manipulation 2 entiers? 'pour un in {0..3}; faire pour b en {000..999}; fais écho "r $ a. $ b.txt"; terminé; fait ». –

+0

Ya, vous avez raison ... – Simon

Répondre

1

L'utilisation de 2 variables est une bonne idée.

Vous pouvez conserver le format zéro de remplissage avec option -f suivants:

#!/bin/bash 
declare -i int=3; 
declare -i dec=1000; 

for i in $(seq 1 $int);do 
     for j in $(seq -f "%03g" 1 $dec); 
       do echo r$i.$j.txt; # or do find . -name "r$i.$j.txt"; 
     done; 
done; 
0

Réponse 1) Pour les calculs flottants, vous devrez déléguer la tâche à d'autres programmes tels que la Colombie-Britannique.

Par exemple:

echo "scale=3;20.8/4 | bc 5.200

Pour plus d'options, vous pouvez vérifier:

https://unix.stackexchange.com/questions/40786/how-to-do-integer-float-calculations-in-bash-or-other-languages-frameworks
https://unix.stackexchange.com/questions/76060/perform-floating-point-arithmetic-in-shell-script-variable-definitions
How do I use floating-point division in bash?

pour savoir les noms de fichiers dont le nombre de flotteur, vous pouvez utiliser des expressions régulières avec find commande:

$touch r3.987.txt $find . -regextype sed -regex ".*/r[0-9]\.[0-9]\{3\}.txt$" ./r3.987.txt

type régulier d'expression est celle de sed, trouver. signifie que vous trouverez dans le répertoire courant

  • */=> pour vérifier que les noms de fichiers seulement et ignorer la principale structure de répertoire

  • [0-9] correspond à un chiffre dans la plage 0 à 9

  • \.des moyens de correspondre à un point

  • [0-9] \ {3} \ moyens [0-9] {3} pour correspondre exactement à 3 chiffres et chaque chiffre peut être dans la gamme 0-9

  • et enfin se terminant en .txt

que pour réponse 2) vous pouvez obtenir cette valeur flottante comme une chaîne en boucle à travers la sortie de la commande find

$for filename in "$(find . -regextype sed -regex ".*/r[0-9]\.[0-9]\{3\}.txt$")" 
> do 
> echo "Filename is $filename" 
> floatValueAsString=$(echo "$filename" | egrep -o '[0-9]\.[0-9]{3}') 
> echo "Float value as string is $floatValueAsString" 
> done 
Filename is ./r3.987.txt 
Float value as string is 3.987