Оболочки циклы с использованием нецелых чисел? - PullRequest
12 голосов
/ 18 марта 2010

Я написал файл .sh, чтобы скомпилировать и запустить несколько программ для домашнего задания. У меня есть цикл for в скрипте, но он не будет работать, если я не использую только целые числа:

#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
    ./hw3_2_2 $i
done

Переменная $ i является входом для программы hw3_2_2, и у меня есть нецелые значения, которые я хотел бы использовать. Как я могу выполнить цикл с помощью кода со списком десятичных чисел?

Ответы [ 6 ]

38 голосов
/ 19 августа 2015

Меня удивляет, что за пять лет никто никогда не упоминал утилиту, созданную только для генерации диапазонов, но, опять же, она появилась в BSD примерно в 2005 году, и, возможно, в то время она вообще не была доступна в Linux.вопрос был задан.

Но вот он:

for i in $(seq 0 0.1 1)

Или, чтобы напечатать все числа одинаковой ширины (с добавлением или добавлением нулей), используйте -w.Это помогает предотвратить отправку чисел в виде «целых чисел», если это может вызвать проблемы.

Синтаксис seq [first [incr]] last, с first по умолчанию 1 и incr по умолчанию 1 или -1,в зависимости от того, last больше или меньше first.Другие параметры см. seq (1) .

9 голосов
/ 19 марта 2010

вы можете использовать awk для генерации десятичных знаков, например, с шагом 0.1

num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}')
for n in $num
do
  ./hw3_2_2 $n
done

или вы можете сделать это полностью в awk

awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }'
9 голосов
/ 18 марта 2010

Самый простой способ - просто перечислить их:

for a in 1.2 3.4 3.11 402.12 4.2 2342.40
do
  ./hw3_2_2 $a
done

Если список огромен, и вы не можете иметь его в виде буквального списка, рассмотрите возможность его создания в файле и затем использовать что-то вроде

for a in $(< my-numbers.txt)
do
  ./hw3_2_2 $a
done

Часть $ (cat.

2 голосов
/ 18 марта 2010

Вот другой способ. Вы можете использовать здесь документ, чтобы включить ваши данные в сценарий:

read -r -d '' data <<EOF
1.1
2.12
3.14159
4
5.05
EOF

for i in "$data"
do
    ./hw3_2_2 "$i"
done

Аналогично:

array=(
1.1
2.12
3.14159
4
5.05
)

for i in "${array[@]}"
do
    ./hw3_2_2 "$i"
done
1 голос
/ 05 мая 2017

Я обычно также использую «seq» в соответствии со вторым ответом, но просто для того, чтобы дать ответ в терминах надежного целочисленного цикла, а затем преобразовать bc в float:

#!/bin/bash 

for i in {2..10..2} ; do 
  x=`echo "scale=2 ; ${i}/10" | bc`
  echo $x
done

дает:

0,2 0,4 +0,6 +0,8 1,0

0 голосов
/ 18 марта 2010

bash не использует десятичные числа. Либо используйте что-то вроде bc, которое может, либо перейдите на более полный язык программирования Остерегайтесь проблем точности хотя.

...