C语言学习(四)shell脚本

本文介绍了Linux系统中Shell脚本的基础知识,包括如何编写简单的Shell脚本、特殊字符的使用、常用的脚本命令及数值与字符串测试方法。此外,还详细讲解了if语句、for循环和while循环等结构控制语句的应用。

       Linux系统中的Shell种类众多,常见的有bash、csh以及ksh等。不同的Shell语法有所不同,不能互换使用,但每种Shell都有其特色之处。这里我们选择bash来讲述Shell脚本编程的基础知识。Shell命令可以事先写在一个文件中,使用时Shell读取文件中的命令逐条解释,这种文件被称为脚本。

1.编写一个Shell脚本

编写一个简单的Shell脚本,输出字符串Hello Word。
hello.sh注意:echo命令的功能是在屏幕上显示一段文字,后面的字符串可以加引号,也可以不加引号。如果加引号,将字符串原样输出;如果不加引号,将字符串中的各个单词用一个空格来分割。
脚本文件编辑完成之后,将其保存为test.sh。在执行脚本之前,需要将其属性改为可执行的,如下所示:
chmod +x test.sh
执行脚本的方法为:./test.sh
 

Shell脚本就是将一系列的Linux命令放在一个文件中执行的实用程序。Shell脚本可以利用vim等文本编辑器来编写。Shell脚本的格式是固定的,如下所示:
#!/bin/bash                                             #指定解释执行该脚本文件的Shell程序
# 注释
命令…
注:一行未完成,可以在行尾加上“\”字符,表示与下一行合并为一行。

2.特殊字符

引号分为双引号、单引号和反引号。
1、由双引括起来的字符,除$、`(反引号)和\保留其特殊功能外,其余全为普通字符号
例如:
(1)$用于变量的引用;
变量的定义引用和清除:

STR=“Hello world”         #对变量STR进行赋值
                      echo $STR或echo ${STR}  #用$对其进行引用
                      unset STR                        #清除STR变量 


(2)echo“现在的地址是`pwd`”,输出结果为:现在的地址是/root(`pwd`被解释为命令);
(3)\为转义字符,使用-e进行解析,如:echo -e "a\nd"       //  \n自动换行
另外,在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
2、单引号内部不能使用$、`(反引号)和\,都作为普通字符对待。 

3.常用脚本命令

echo ${#STR}                                    #计算长度(字母个数) 
echo ${STR:1:3}                                 #显示第2,3,4个字符
echo “`expr index “$STR” 23`”       #在变量STR中23 谁先出现 显示谁位置
数组:
array1=(0 1 2 3 4)                                     #3种定义赋值数组(圆括号)
echo ${array1[0]}                                     #显示数组值
echo ${#array1[@]}或echo ${#array1[*]} #计算数组长度
 
算数运算:
c=`expr $a + $b`                           #.sh中的加减乘除
c=`expr $a \* $b`                          #.sh中的乘法

 4.数值测试

 

数值测试可用的操作符包括:
-eq:两个数相等;(=)
-ne:两个数不相等;(!=)
-gt:第一个数大于第二个数;(>)
-lt:第一个数小于第二个数;(<)
-le:第一个数小于等于第二个数;(<=)
-ge:第一个数大于等于第二个数。(>=)

5.字符串测试

字符串测试的主要操作符包括:
==:两个字符串相等;
!=:两个字符串不等;
-z:字符串为空;
-n:字符串不为空。 

6.结构控制语句

 if语句用来实现条件分支结构,它的一般格式为:
     if 条件1
     then  
            命令1
     elif条件2
     then  
            命令2
     else  
            命令3
     fi
 
注意:if语句以它的反写fi结尾。如果条件1成立,则执行then后面的命令1;如果条件1不成立,但条件2成立,则执行命令2;如果两个条件都不成立,则执行命令3。

 

 for循环的一般格式为:
     for变量名in [列表]
          do
              命令1  命令2  …
     done
 
     在for循环中,使用变量名来遍历列表中所有取值,当变量值在列表中时,即执行一次所有命令。for循环的程序流程

 while循环的一般格式为:
     while 条件
          do  
              命令1  命令2  ...
     done
 
     当条件成立时,do和done之间的命令才会被执行,执行完成后重新测试条件,如果不成立则终止循环。while循环的程序流程

<think>嗯,用户问的是C语言怎么调用shell脚本。这个问题很实用,可能是想实现自动化操作或者系统管理功能。我需要回忆C语言中执行外部命令的几种方法。 最常用的应该是system()函数,它直接执行字符串形式的命令,比如system("./script.sh")。这个方法最简单但可能不够安全,特别是当命令字符串包含用户输入时会有注入风险。 接着想到exec函数族,比如execlp()。它们会替换当前进程,所以通常配合fork()使用。这种虽然复杂些但更安全可控,还能处理管道等高级功能。 用户可能是开发者或学生,想在C程序中集成脚本功能。考虑到用户要求中文回答,回复时要注意术语准确性和示例清晰度。最后必须按规则生成3-5个相关问题,问题要围绕执行方法对比、安全性、参数传递等自然延伸。 对了,还要提醒用户system()会阻塞进程,而fork-exec可以非阻塞执行。这个细节对实际应用很重要。示例代码要包含两种主流法的基本模板,标注关键步骤。 </think>在C语言中调用Shell脚本主要通过以下几种方式实现: ### 1. 使用 `system()` 函数(最简便) ```c #include <stdlib.h> int main() { // 直接执行Shell命令或脚本 int result = system("./script.sh"); // 检查返回值(非零通常表示错误) if (result != 0) { printf("执行失败,错误码: %d\n", result); } return 0; } ``` **特点**: - 直接执行字符串形式的Shell命令 - 阻塞当前进程直到命令执行完毕 - 返回值是命令的退出状态码 ### 2. 使用 `fork()` + `exec()`(更底层控制) ```c #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 execlp("/bin/sh", "sh", "-c", "./script.sh", NULL); perror("exec失败"); // 只有exec失败才会执行到这里 exit(1); } else if (pid > 0) { // 父进程 int status; waitpid(pid, &status, 0); // 等待子进程结束 if (WIFEXITED(status)) { printf("子进程退出码: %d\n", WEXITSTATUS(status)); } } else { perror("fork失败"); } return 0; } ``` **特点**: - 通过创建子进程执行脚本 - 可精细控制输入/输出流 - 避免`system()`的安全风险(如命令注入) ### 3. 使用 `popen()`(需要获取命令输出时) ```c #include <stdio.h> int main() { FILE *pipe = popen("./script.sh", "r"); // "w"表示向命令输入 if (!pipe) { perror("popen失败"); return 1; } char buffer[128]; while (fgets(buffer, sizeof(buffer), pipe) != NULL) { printf("脚本输出: %s", buffer); // 逐行读取输出 } int status = pclose(pipe); // 关闭管道并获取状态 if (status == -1) { perror("关闭失败"); } else { printf("脚本退出码: %d\n", status); } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使劲编

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值