05_for循环/重定向/数组

本文介绍了Shell脚本中的for循环和while循环的使用方法,并通过示例展示了如何利用这些循环进行数值求和。此外,还解释了重定向的概念及其实现方式,以及如何在Shell中定义和使用数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,for循环

for循环(元素遍历 | 迭代)
格式1:
for 变量名 in 列表 (v1 v2 v3 v4......)
do
 code.....#循环体
done

在这里插入图片描述

格式2:
for 变量名 in `seq N` 
do
 code.....#循环体
done

在这里插入图片描述

eg:求1–100的和

在这里插入图片描述

while 循环和for就是格式不大一样,作用差不多

格式:
遍历1--10   和python一样的用法

在这里插入图片描述

eg:用while循环求1–100之间的整数和

在这里插入图片描述

二,重定向

是什么?

可用将命令产生的数据保存到磁盘文件

为什么?

一种
格式1:命令 1>> 磁盘文件(将正确结果输出到文件)
格式2:命令 2>> 磁盘文件(将错误结果输出到磁盘文件)

在这里插入图片描述
在这里插入图片描述

三,数组

是什么?

数组也是变量,但是是特殊的变量,可以存储好多个值

在这里插入图片描述

/* \*file pattern_replace.h \*brief the source for homework1.1 \* homework1.1: 101->011 \*author huangzhifu<huangzhifu@tp-link.com.hk> \*version 1.0.0 \*date 08/01/2025 \*history */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #define MAX_INPUT_LEN 1024 #define MAX_ARGS 64 int main() { char input[MAX_INPUT_LEN]; char* args[MAX_ARGS]; pid_t pid; int pipefd[2]; while (1) { // 打印提示符并读取用户输入 printf("easyshell> "); fflush(stdout); if (fgets(input, sizeof(input), stdin) == NULL) break; // 移除末尾换行符 input[strcspn(input, "\n")] = '\0'; // 处理 exit 命令 if (strcmp(input, "exit") == 0) { printf("Exiting shell...\n"); break; } // 创建管道 if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } // 创建子进程执行命令 pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) { // 子进程 close(pipefd[0]); // 关闭读端 // 重定向标准输出到管道写端 dup2(pipefd[1], STDOUT_FILENO); close(pipefd[1]); // 解析命令参数 int i = 0; char* token = strtok(input, " "); while (token != NULL && i < MAX_ARGS - 1) { args[i++] = token; token = strtok(NULL, " "); } args[i] = NULL; // 参数数组以 NULL 结尾 // 执行命令 execvp(args[0], args); perror("execvp"); exit(EXIT_FAILURE); } else { // 父进程 close(pipefd[1]); // 关闭写端 FILE* pipe_read = fdopen(pipefd[0], "r"); char line[MAX_INPUT_LEN]; int stop_detected = 0; // 逐行读取子进程输出 while (fgets(line, sizeof(line), pipe_read) != NULL) { // 打印子进程输出 printf("%s", line); // 检测是否包含 "stop" if (strstr(line, "stop") != NULL) { printf("Detected 'stop'. Killing child process...\n"); kill(pid, SIGKILL); // 终止子进程 stop_detected = 1; break; } } // 关闭管道并等待子进程结束 fclose(pipe_read); int status; waitpid(pid, &status, 0); if (stop_detected) { printf("Child process terminated by shell.\n"); } else if (WIFEXITED(status)) { printf("Child process exited with status %d.\n", WEXITSTATUS(status)); } } } return 0; } 详细解释代码中的每一行
最新发布
08-08
#include "sys.h" #include "usart.h" //如果SYSTEM_SUPPORT_OS为真,即使用ucos,则包括下列的头文件 #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos使用 #endif //加入以下代码,支持printf函数,而不需要选择Use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0); //循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } #endif //使用MicroLib的方法 /* int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } int GetKey (void) { while (!(USART1->SR & USART_FLAG_RXNE)); return ((int)(USART1->DR & 0x1FF)); } */ #if USART1_RX_EN //如果使能了接收 //串口1中断服务程序 //注意,读取USARTx->SR可以避免一些不必要的错误 uint8_t USART_RX_BUF[USART_RX_LEN];//接收缓冲,最大为USART_RX_LEN个字节 /*************************************************************** **反映接收状态: **bit15, 接收完成标志 **bit14, 接收到0x0D **bit13~0,接收到的有效字节数目 ***************************************************************/ uint16_t USART_RX_STA=0; //接收状态标记 /*************************************************************** **函 数 名:uart_init **功能描述:初始化串口1函数 **输入参数:bound,串口波特率 **输出参数:无 ***************************************************************/ void uart_init(uint32_t bound) { //GPIO 端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能 USART1, GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //USART1_TX GPIOA.9 初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.9 //USART1_RX GPIOA.10 初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.10 //USART1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级 3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级 3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 NVIC 寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound; //串口波特率 //字长为 8 位数据格式 USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口 1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口,接收中断 USART_Cmd(USART1, ENABLE); //使能串口 1 } void USART1_IRQHandler(void) //串口1中断服务程序 { uint8_t Res; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0) //接收未完成 { if(USART_RX_STA&0x4000) //接收到了0x0D { if(Res!=0x0a)USART_RX_STA=0; //接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res; USART_RX_STA++; if(USART_RX_STA>(USART_RX_LEN-1)) USART_RX_STA=0; //接收数据错误,重新开始接收 } } } } #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS OSIntExit(); #endif } #endif
05-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值