从单独的输入行(从文件或标准输入)格式化bash命令行的方法有多种。下面是一种常见的方法:
fopen
和fread
。如果是从标准输入读取,可以使用fgets
函数。trim
。#
开头,如果是则跳过。strtok
。$
开头,表示是一个变量,可以使用字符串处理函数,如strstr
和strchr
,找到变量名,并替换为对应的值。'
或"
开头,表示是一个字符串,可以使用字符串处理函数,如strchr
,找到字符串的结束位置,并将整个字符串替换为对应的值。#
开头,表示是一个注释,可以将该单词及其后面的内容都忽略。strcat
和sprintf
。下面是一个示例代码,演示如何实现上述步骤:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 1024
char* trim(char* str) {
char* end;
// 去除行尾的空格和换行符
end = str + strlen(str) - 1;
while (end > str && (*end == ' ' || *end == '\n')) {
*end = '\0';
end--;
}
// 去除行首的空格
while (*str == ' ') {
str++;
}
return str;
}
void formatCommand(char* line) {
char* token;
char* command = malloc(MAX_LINE_LENGTH);
command[0] = '\0';
// 分割行为单词
token = strtok(line, " \t");
while (token != NULL) {
// 处理变量
if (token[0] == '$') {
// 替换为对应的值
char* value = getenv(token + 1);
if (value != NULL) {
strcat(command, value);
}
}
// 处理字符串
else if (token[0] == '\'' || token[0] == '\"') {
// 找到字符串的结束位置
char* end = strchr(token + 1, token[0]);
if (end != NULL) {
// 替换为对应的值
strncat(command, token + 1, end - token - 1);
}
}
// 处理注释
else if (token[0] == '#') {
// 忽略注释及其后面的内容
break;
}
// 处理普通单词
else {
strcat(command, token);
}
strcat(command, " ");
token = strtok(NULL, " \t");
}
printf("%s\n", trim(command));
free(command);
}
int main() {
char line[MAX_LINE_LENGTH];
// 从标准输入读取输入行
while (fgets(line, sizeof(line), stdin) != NULL) {
formatCommand(line);
}
return 0;
}
这个示例代码可以从标准输入读取输入行,并将格式化后的命令行输出到标准输出。你可以将输入行写入一个文件,然后通过重定向将文件内容作为标准输入,从而实现从文件中读取输入行的功能。
这个方法可以帮助你将输入行中的变量和字符串替换为对应的值,并去除注释和多余的空格,从而得到格式化后的bash命令行。
领取专属 10元无门槛券
手把手带您无忧上云