首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从单独的输入行(从文件或标准输入)格式化bash命令行

从单独的输入行(从文件或标准输入)格式化bash命令行的方法有多种。下面是一种常见的方法:

  1. 首先,读取输入行。如果是从文件中读取,可以使用文件读取函数,如fopenfread。如果是从标准输入读取,可以使用fgets函数。
  2. 对于每一行输入,进行以下处理:
  3. a. 去除行首和行尾的空格和换行符,可以使用字符串处理函数,如trim
  4. b. 检查行是否为空行,如果是则跳过。
  5. c. 检查行是否以注释符号#开头,如果是则跳过。
  6. d. 将行按照空格或制表符进行分割,可以使用字符串处理函数,如strtok
  7. e. 对于每个分割后的单词,进行以下处理:
    • 如果单词以$开头,表示是一个变量,可以使用字符串处理函数,如strstrstrchr,找到变量名,并替换为对应的值。
    • 如果单词以'"开头,表示是一个字符串,可以使用字符串处理函数,如strchr,找到字符串的结束位置,并将整个字符串替换为对应的值。
    • 如果单词以#开头,表示是一个注释,可以将该单词及其后面的内容都忽略。
    • f. 将处理后的单词重新组合成一行命令,可以使用字符串处理函数,如strcatsprintf
  • 输出格式化后的命令行。

下面是一个示例代码,演示如何实现上述步骤:

代码语言:txt
复制
#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命令行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

shell-脚本集合3

read命令是一个内置命令,用于从终端或文件读取输入(参见表14-1)。read命令读取一个输入行,直至遇到换行符。行尾的换行符在读入时将被转换成一个空 字符。如果read命令后未跟变量名,读入的行将被赋给内置变量REPLY。也可以用read命令来中断程序的运行,直至用户输入一个回车键。要知道如何 有效地使用read命令从文件读取输入行,请参见14.6节的“循环控制命令”。如果带-r选项,read命令将忽略反斜杠/换行符对,而把反斜杠作为行 的一部分。read命令有4个控制选项:-a,-e,-p,-r②。 表14-1 read命令 格式                含义 read answer       从标准输入读取一行并赋值给变量answer read first last   从标准输入读取一行,直至遇到第一个空白符或换行符。把用户键入的第一个词存到变量first中,把该行的剩余部分保存到变量last中 read              标准输入读取一行并赋值给内置变量REPLY read –a arrayname 读入一组词,依次赋值给数组arrayname③ read -e           在交互式shell命令行中启用编辑器。例如,如果编辑器是vi,则可以在输入行时使用vi命令③ read –p prompt    打印提示符,等待输入,并将输入赋值给REPLY变量③ read –r line      允许输入包含反斜杠③

01

Linux xargs 命令

xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:

01

Awesome-Shell资源

█████╗ ██╗ ██╗███████╗███████╗ ██████╗ ███╗ ███╗███████╗ ██╔══██╗██║ ██║██╔════╝██╔════╝██╔═══██╗████╗ ████║██╔════╝ ███████║██║ █╗ ██║█████╗ ███████╗██║ ██║██╔████╔██║█████╗ ██╔══██║██║███╗██║██╔══╝ ╚════██║██║ ██║██║╚██╔╝██║██╔══╝ ██║ ██║╚███╔███╔╝███████╗███████║╚██████╔╝██║ ╚═╝ ██║███████╗ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ███████╗██╗ ██╗███████╗██╗ ██╗ ██╔════╝██║ ██║██╔════╝██║ ██║ ███████╗███████║█████╗ ██║ ██║ ╚════██║██╔══██║██╔══╝ ██║ ██║ ███████║██║ ██║███████╗███████╗███████╗ ╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝

00
领券