Я ищу способ передать аргументы командной строки сценарию 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, кстати.