Передача аргументов скрипту ab c - PullRequest
1 голос
/ 08 мая 2020

Я ищу способ передать аргументы командной строки сценарию ab c.

Например, возьмите этот простой скрипт b c, который выводит 10 цифр числа Пи (с округлением):

#!/bin/bc -lq

n_digits = 10;

scale = n_digits + 1;

/* calculation, replace later with a better algorithm */
result = 4 * a(1);                /* arctan(1) = pi/4 */

/* rounding to n_digits */
t = 10^scale;
result *= t;
if (result < 0) result -= 50; /* unnecessary, but generally useful */
if (result > 0) result += 50; /* always true in this specific case */
scale -= 2;
result /= t;

print result, "\n";

quit;

В скрипте для переменной n_digits жестко задано значение 10. Я хочу передать ему значение из командной строки. Я мог бы использовать функцию read() (n_digits = read();), чтобы передать ей число из стандартного ввода, например:

$ ./pi <<< 20
3.1415926535897932385

Но для этого требуется хитрость с перенаправлением или конвейером, и это не очень удобно для пользователя. Аргумент командной строки был бы намного лучше.

Обходной путь, который я могу придумать, - это встраивать сценарий b c в сценарий bash, например, например:

#!/bin/bash

bc -lq << EOF
n_digits = $1;
scale = n_digits + 1;

/* calculation, replace later with a better algorithm */
result = 4 * a(1);                /* arctan(1) = pi/4 */

/* rounding to n_digits */
t = 10^scale;
result *= t;
if (result < 0) result -= 50; /* unnecessary, but generally useful */
if (result > 0) result += 50; /* always true in this specific case */
scale -= 2;
result /= t;

print result, "\n";

quit;
EOF

Это работает, но это плохая эстетика c, и это кажется ненужным. Кроме того, похоже, что его можно использовать для внедрения произвольного кода, поэтому было бы неплохо реализовать проверки в сценарии bash. Беспорядочно ...

Мой вопрос: Можно ли сделать это напрямую с помощью скрипта ab c? Есть ли какая-то переменная argv, которую я просто не могу найти в документации?

Я использую GNU b c, кстати.

...