第十章——sh编程
sh脚本
1.sh脚本是一种为shell编写的脚本程序。这个程序用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。
第一行必须为 #!/bin/sh
2.命令行使用chmod +x <filename>编译后才能用./filename来运行。
3.注释:以#开头的句子表示注释,直到这一行的结束。
sh脚本与C程序
1. sh 是一个解释程序,逐行读取 sh 脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么 sh 可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反, C 程序必须先编译链接到一个二进制可执行文件,然后通过主 sh 的子进程运行二进制可执行文件。
2.在 C 程序中,每个变量必须有一个类型,例如 char 、 int 、 float 、派生类型(如 struct )等。相反,在 sh 脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。
3.每个 c 程序必须有一个 main() 函数,每个函数必须定义一个返回值类型和参数(如有)。相反, sh 脚本不需要 main 函数。在 sh 脚本中,第一个可执行语句是程序的入口点。
4.平均每行脚本语言代码执行成百上千条机器指令,高级语言则大约为五条。其中的原因之一是脚本语言使用了解释器,更大的原因是脚本语言的操作更加强大。脚本语言的代码量和编程时间都少于高级语言。
命令行参数
Shell编程中的命令行参数(位置参数)与C程序中的main函数传参类似。这些位置参数用$N表示,N为正整数,表示命令行传入的第N个参数。N从0开始进行标记,与C语言中的数组表示的方式相同。例如,$1表示传递给脚本程序的第一个参数,并依此类推。$0表示程序本身的名字。
读取参数
读取脚本名称
读取参数个数
读取参数列表的最后一个参数
遍历参数列表
检测参数
移动参数
sh变量
在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。
变量定义和赋值
在Shell脚本中,可以使用等号(=)来定义和赋值变量,例如:variable_name=value
。变量名通常是字母、数字和下划线的组合,但不能以数字开头。
要赋值给一个变量,可以这样写:
变量类型
在Shell中,变量可以是全局变量或局部变量。全局变量在整个脚本中都可见,而局部变量只在定义它的函数或代码块中可见。
变量的引用
使用$
符号来引用变量的值,例如:echo $variable_name
。这将输出变量的值。
有时候变量名很容易与其他文字混淆,
如果num不加{ },系统编译时就会将$之后的内容认为是变量名,这样的变量根本不存在,所以无法打印:
添加{ }后系统可编译出存在的变量num:
特殊变量
Shell中有一些特殊变量,如$0
表示脚本名称,$1
、$2
等表示脚本的参数,$#
表示参数的数量,$?
表示上一个命令的退出状态等。
环境变量
环境变量是一种全局变量,用于存储操作系统和Shell的配置信息。一些常见的环境变量包括PATH
(指定可执行文件的搜索路径)、HOME
(指定当前用户的主目录)、USER
(表示当前用户名)等。
变量的操作和修改
可以使用各种命令和操作符来修改和操作变量的值,如let
命令、expr
命令、+=
操作符等。
删除变量
使用unset
命令可以删除一个变量,例如:unset variable_name
。
以上程序执行后无输出:
变量的作用域
变量的作用域决定了变量在何处可见。全局变量在整个脚本中可见,而局部变量只在定义它的函数或代码块中可见。
sh中的引号
sh 有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。例如:
A = xyz
echo \$A ==>$A #原封不动地回报$
echo '$A' ==>$A #在单引号中不进行替换
echo "see $A" ==> see xyz #在双引号中替换$A
通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。
sh命令
内置命令
shell有很多内置在其源代码中的命令。这些命令是内置的,所以shell不必到磁盘上搜索它们,执行速度因此加快。
内置sh命令表可查看此网址:https://blog.csdn.net/imxiangzi/article/details/50373541
Linux命令
1.echo命令
echo 只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
2.expr命令
运行结果报错:
将乘法一行删除后可运行,向ChatGpt请教后发现乘号*前要加转移符 \ :
程序修改后运行成功:
总结:expr除了可用于数学运算外,还可以用于字符串操作、逻辑运算、比较大小等。在使用 expr
进行数学运算和逻辑运算时,需要使用反斜杠(\
)转义特殊字符,如 &
和 |
。字符串操作中,要注意将字符串用双引号括起来,以处理包含空格或特殊字符的字符串。
另外,虽然 expr
在Shell脚本中是一个有用的工具,但它有一些限制,例如不支持浮点数运算,而且在复杂的数学和字符串操作中可能不够灵活。在现代Shell脚本编程中,通常使用更强大的数学和字符串操作工具,如 $((...))
或 ((...))
进行数学运算,以及 ${variable##pattern}
和 ${variable%%pattern}
进行字符串操作。这些工具更加直观且功能更强大。
3.管道命令
在sh脚本中经常使用管道作为过滤器。
书中介绍不详细,向ChatGpt请教:
总结:将 | 前函数的输出作为 | 后函数的输入。
4.实用命令
除了上面的 Linux 命令之外, sh 还使用许多其他实用程序作为命令。其中包括:
awk :数据处理程序。
cmp :比较两个文件。
comm :选择两个排序文件共有的行。
grep :匹配一系列文件的模式。
diff :找出两个文件的差异。
join :通过使用相同的键来连接记录以比较两个文件。
sed :流或行编辑命令。
sort :排序或合并文件。
tail :打印某个文件的最后 n 行。
tr :一对一字符翻译。
uniq :从文件中删除连续重复行。
命令替换
在 sh 中,$ A 会被替换成 A 值。同样,当 sh 遇到' cmd '(用引号括起来)或 S ( cmd )时,它会先执行 cmd ,然后用执行的结果字符串替换$( cmd )。
sh控制语句
sh是一种编程语言,支持许多执行控制语句,类似于C语言中的语句。
if-else-fi语句
- 在条件判断中,变量通常需要用双引号括起来,以处理可能包含空格或特殊字符的情况。
fi
表示结束if
块,它是if
的倒写,用于标识条件判断的结束。
#①条件判断
if [condition] then #条件为真时执行的语句; else #条件为假时执行的语句; fi
#②多重条件
if [condition1]
then
#条件1为真时执行的语句;
elif [condition2]
#条件2为真时执行的语句;
else
#所有条件都不满足时执行的语句;
fi
#③条件表达式
#条件通常使用方括号[ ]
来包含条件表达式。条件表达式可以包括比较操作符(如-eq
、-ne
、-lt
、-gt
等)和逻辑操作符(如&&
、||
)。
if [ "num1" -ne "num2" ]; #注意:比较字符串用==或!=
then echo "num1 不等于 num2"
if [ "num1" -eq "num2" ];
then echo "num1 等于 num2"
if [ "num1" -gt "num2" ];
then echo "num1 大于 num2"
if [ "num1" -lt "num2" ];
then echo "num1 小于 num2"
for语句
for var in item1 item2 ... itemN do commands done
写成一行:for var in item1 item2 ... itemN; do command1; command2… done;
while语句
while condition do command done
until-do语句
until [condition] do #循环体 done
case语句
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
sh函数
--------方法①-------- function 函数名 { #函数代码 } --------方法②-------- 函数名() { #函数代码 }
sh脚本中的相关命令字符:
向ChatGpt请求苏格拉底式提问
学习总结
学习本章内容时较为轻松,相较于C语言编程,shell 编程更为简洁易懂。
标签:脚本,语句,变量,编程,命令,sh,Linux,字符串 From: https://www.cnblogs.com/20211115fyq/p/17725830.html