Иногда нужно написать скрипт, для которого возможностей bash'а не хватает. С другой стороны, использование нормального ЯП тоже не оправдано. К примеру, bash не умеет арифметику с вещественными числами(только целые), ну или bash не умеет работать с отдельными символами(как с байтами. Точнее умеет, но работать с символами неудобно).
Можно использовать обычный ЯП C, стандарта C99, и интерпретатор/компилятор tcc.
Вот простая задача: посчитать символы в тексте, и вывести их процентное содержание. На bash, скрипт будет очень сложный и громоздкий, а вот реализация на сишке:
#!/usr/bin/tcc -run
#include <stdio.h>
#include <libgen.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char* argv[])
{
const char* myname = basename(argv[0]);
if(argc!=2)
{
fprintf(stderr, "Usage: %s FILENAME\n",
myname);
return 1;
}
int freq[256];
int j;
for(j=0; j<256; j++) freq[j] = 0;
FILE* fs = fopen(argv[1], "r");
if(!fs)
{
fprintf(stderr, "%s:Can't open file '%s' (%s)\n", myname, argv[1], strerror(errno));
return 1;
}
int c;
while((c = fgetc(fs))!=EOF)
freq[c]++;
fclose(fs);
double sum = 0.0;
for(j=0; j<256; j++) sum += freq[j];
if(sum==0.0)
{
fprintf(stderr, "%s:File '%s' is empty\n", myname, argv[1]);
return 1;
}
for(j=0; j<256; j++)
if(freq[j]>0)
printf("%d\t%c\t%d\t%f%%\n",
j,
j<=32 || j>=128? ' ': j,
freq[j],
(freq[j]/sum)*100);
return 0;
}
пользоваться этим можно как с любым другим скриптом: сохранить файл, дать право использования(выполнения), и запускать. К примеру я сохранил в wcf.c
9 66 7.603687%
10 51 5.875576%
32 62 7.142857%
33 ! 4 0.460829%
34 " 10 1.152074%
35 # 6 0.691244%
37 % 12 1.382488%
39 ' 7 0.806452%
40 ( 21 2.419355%
41 ) 21 2.419355%
42 * 4 0.460829%
43 + 9 1.036866%
44 , 15 1.728111%
45 - 1 0.115207%
46 . 7 0.806452%
47 / 4 0.460829%
48 0 13 1.497696%
49 1 8 0.921659%
50 2 7 0.806452%
51 3 1 0.115207%
53 5 4 0.460829%
54 6 4 0.460829%
56 8 1 0.115207%
58 : 4 0.460829%
59 ; 24 2.764977%
60 < 9 1.036866%
61 = 15 1.728111%
62 > 7 0.806452%
63 ? 1 0.115207%
65 A 1 0.115207%
67 C 1 0.115207%
69 E 4 0.460829%
70 F 4 0.460829%
73 I 2 0.230415%
76 L 2 0.230415%
77 M 1 0.115207%
78 N 1 0.115207%
79 O 1 0.115207%
85 U 1 0.115207%
91 [ 12 1.382488%
92 \ 7 0.806452%
93 ] 12 1.382488%
97 a 18 2.073733%
98 b 5 0.576037%
99 c 18 2.073733%
100 d 13 1.497696%
101 e 39 4.493088%
102 f 30 3.456221%
103 g 11 1.267281%
104 h 8 0.921659%
105 i 28 3.225806%
106 j 19 2.188940%
108 l 12 1.382488%
109 m 15 1.728111%
110 n 38 4.377880%
111 o 12 1.382488%
112 p 7 0.806452%
113 q 7 0.806452%
114 r 49 5.645161%
115 s 27 3.110599%
116 t 28 3.225806%
117 u 16 1.843318%
118 v 5 0.576037%
119 w 1 0.115207%
121 y 5 0.576037%
123 { 4 0.460829%
124 | 2 0.230415%
125 } 4 0.460829%
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)