如何在Shell脚本中使用strtok函数快速处理日期数据并插入数据库
今天早上我正在写一个需求。需求相当紧急,需要当天完成。我粗略分析了一下,发现可以从shell脚本中插入一系列日期,并通过调用proc生成的可执行文件将日期传输到后台数据库。计算在数据库中执行。需要将日期字符串拆分成整数,插入到int数组中。手动实现太慢了,所以我们直接借用系统的strtok函数。

场景模拟:
1.shell脚本:
#diao.sh
#!/bin/bash
日期1 =“20170622,20170623,20170626,20170627,20170628,20170629,20170627”
日期2 =“20170628,20170629,20170630”
如果 [ $1 -eq 0 ]
然后
计算 $date1
别的
计算 $date2
2.这里用C代码模拟后台proc代码,重点是使用strtok函数实现字符串切分。
#包括
#包括
#include int main(int argv,char * argc[])
字符缓冲区[100];
字符 * p = NULL;
字符 buf2[100][9];
整数数据[100];
int len = 0;
整数 i = 0;
memset(buf,0x00,sizeof(buf));
memset(buf2,0x00,sizeof(buf2)); memset(数据,0x00,sizeof(数据));
memcpy(buf,argc[1],strlen(argc[1]));
printf("buf=%s\n",buf);
/* 下面代码将字符串按照“,”进行分割,然后转为整数存入整数数组*/
p= strtok(buf, ",");
而(p!= NULL){
strcpy(buf2[len],p);
数据[len]= atoi(buf2[len]);
printf("buf2[%d]=%s\n",len,buf2[len]);
伦++;
p= strtok(NULL, ","); // 再次调用strtok函数
/* 上面代码按照“,”分割字符串,然后转为整数存入整数数组*/
for ( i = 0 ; i < len ; ++i){
printf("数据[%d]=%d\n",i,数据[i]);
编译及运行状态:
思考:将上面代码中的字符串截取,转换为整数。将其存储在整数数组部分中,形成一个独立的函数并调用它。多功能性会突然增加。
3.使分割过程成为一个独立的函数
函数名称为:mystrtok,仍然调用系统的strtok。如果直接使用系统的strtok而不做任何处理,是不会被尝试的,因为strtok输出的都是char*类型。
#include<string.h> #include#include int mystrtok(char * str,const char * delim, char buf[][9],int * len, int data[]) { char * p = NULL; int i = 0; p = strtok(str, delim); while( p!= NULL){ strcpy(buf[i],p); data[i] = atoi(buf[i]); i++; p = strtok(NULL, delim); // 再次调用strtok函数 } *len = i; return 0; } int main(int argv ,char * argc[]) { char buf[100]; char * p = NULL; char buf2[100][9]; int data[100]; int len = 0; int i = 0; memset(buf,0x00,sizeof(buf)); memset(buf2,0x00,sizeof(buf2)); memset(data,0x00,sizeof(data)); memcpy(buf,argc[1],strlen(argc[1])); printf("buf=%s\n",buf); /* 下面代码按照","切分字符串,然后转化成整数,存入整数数组中*/ /* p = strtok(buf, ","); while( p!= NULL){ strcpy(buf2[len],p); data[len] = atoi(buf2[len]); printf("buf2[%d]=%s\n",len,buf2[len]); len++; p = strtok(NULL, ","); // 再次调用strtok函数 } */ /* 上面的代码按照","切分字符串,然后转化成整数,存入整数数组中*/ /* 思考,将上述代码写成一个独立的函数,进行调用*/ mystrtok(buf,",",buf2,&len,data); for ( i = 0 ; i < len ; ++i){ printf ("data[%d]=%d\n",i,data[i]); } }
运行新代码:
上述函数可以用于任何字符串切割场景,特别是当以某种方式切割数字字符串时。
另外值得注意的是,当shell脚本调用C程序时,main函数的参数接收shell脚本的参数,然后进行处理。
特别是字符串类型char *、字符数组char buf[][]、字符数组指针char *p[]、const char *。需要了解这些类型是否可以转换、如何转换、如何相互赋值。 ,一定很清楚。
本文永久更新链接地址: