Зацикливание команды python из bash, нельзя использовать числа с плавающей запятой в качестве параметра для команды - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь выполнить команду l oop a python в моем bash терминале, чтобы получить много значений с плавающей запятой для определенного параметра.

Это то, что у меня есть:

for ((t=0; t <= 165; t=t+5));
   do python3 filename 1 [echo $t/100] 0;
   done

Я хочу увеличить на l oop значения от 0 до 1,65 с шагом 0,05. Только bash, похоже, не принимает такие значения с плавающей запятой, а команда echo не распознается python. У меня возникли ошибки типа «невозможно преобразовать [эхо в число с плавающей запятой» или что (неправильный синтаксис, если я заменяю квадратные скобки.

Что я могу сделать, чтобы исправить это? Идеальная ситуация была бы для моего сценарий для запуска:

python3 filename 1 0.00 0
python3 filename 1 0.05 0
.
.
.
python3 filename 1 1.65 0

каждый за другим без их одновременного выполнения.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 14 июля 2020

В bash версии 4.0+ вы можете использовать раскрытие фигурных скобок и манипуляции со строкой, чтобы сформулировать это число с плавающей запятой:

for n in {000..165..5}; do
  echo python3 filename 1 "${n%??}.${n#?}" 0
done

${n%??} удаляет 2 символа из конца строки, ${n#?} удаляет 1 символ из начала строки.

2 голосов
/ 14 июля 2020

Самый простой способ без лишнего шума - это использовать команду последовательности seq. Эта команда позволяет вам составлять последовательность чисел с любым приращением:

seq FIRST INCREMENT LAST

В случае OP есть запрос на генерацию чисел 0.00 0.05 0.10 ... 1.65, так что все, что нужно необходимо сделать:

for x in $(seq 0 0.05 1.65); do
  python3 filename 1 "$x" 0
done
1 голос
/ 14 июля 2020

Выполнение l oop внутри bc, Форматирование числа с помощью bash, Вызов скрипта с помощью xargs:

LC_NUMERIC=C printf '%0.2f\n' \
  $(<<<'scale=2;i=0;while(i<=1.65){i;i+=.05}' bc) |
    xargs -l -I{} python3 filename 1 {} 0
0 голосов
/ 14 июля 2020

bash не выполняет арифметические операции с плавающей запятой c. Используйте внешнюю команду, например bc.

for ((t=0; t <= 165; t=t+5));
   do python3 filename 1 "$(echo "scale=2; $t / 100" | bc)" 0
done
0 голосов
/ 14 июля 2020

Выполните деление в сценарии python и вместо этого просто передавайте целые числа.

...