嵌入式培训-Linux系统及C编程高级-DAY6-linux shell脚本编程

2023-12-13 05:59:11

Shell脚本概述

? ? ?Shell脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能

Shell脚本编写流程

Shell脚本的文件扩展名一定是 .sh

命令、选项、参数之间用空格隔开

第一个Shell脚本文件

执行方式 ? ? ? ?

bash test.sh ? ? ? ?

source ?test.sh ? ? ? ?

./test.sh ?? ?

变量介绍

?变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。 ?

变量可以通过变量名访问。在指令式语言中,变量通常是可变的

变量的作用

?用来存放系统和用户需要使用的特定参数(值) ?

变量名:使用固定的名称,一部分变量由系统预设,另一部分变量由用户定义 ?

变量值:能够根据用户设置、系统环境的变化而变化

变量的命名要求

变量的分类

用户自定义变量

在shell编程中通常使用全大写变量,方便识别

$ COUNT=1 (注意!!运算符前后不能加空格,这点与C语言不同)

变量的调用:在变量前加$

$ echo $COUNT

Linux Shell/bash从右向左赋值

$Y=y

$ X=$Y

$ echo $X

y 使用unset命令删除变量的赋值

$ Z=hello

$ echo $Z

hello

$ unset Z

$ echo $Z

用户自定义变量-取值

双引号: 允许通过$符号引用其他变量值

弱引用,其中的变量引用会被替换为变量值

单引号: 禁止引用其他变量值,$视为普通字符 强引用,其中的变量引用不会被替换为变量值,而保持源字符串

反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同

shell脚本中,注释是用#表示

用户自定义变量-数组

echo $a:默认显示数组a的第一个元素

echo ${a[0]} :显示数组中第一个元素,以此类推

echo ${a[-1]}: 显示数组中最后一个元素

echo ${a[*]} 和echo ${a[@]} :显示数组中所有元素

echo ${#a[@]} :显示数组中元素的个数

echo ${a[@]:起始元素id:元素个数]} :显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值

unset a[n] 删除数组中的第n个元素

unset a 删除a这个数组

shell的数组的元素下标编号也是从0开始

只读变量

?变量值不允许修改(重新赋值)的情况 ?

无法使用 unset删除 ?

最快方法重启 ?

readonly

位置变量和预定义变量

$0 ? ?与键入的命令行一样,包含脚本文件名

$1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数

$# ? ? 包含命令行参数的个数(#代表可以自己写的数字)

$@ ? 包含所有命令行参数:“$1,$2,……$9”

$* ? ? 包含所有命令行参数,是一个整体:“$1,$2,……$9”

$? ? ? 包含前一个命令的退出状态

$$ ? ? 包含正在执行进程的ID号

环境变量

常用环境变量

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径 ?

export可以将变量指定为全局变量

Shell程序

Shell 程序由零或多条shell语句构成。 shell语句包括三类: ?

说明性语句 ?

功能性语句 ?

结构性语句。

说明性语句(注释行)

?以#号开始到该行结束,不被解释执行 注释行可以出现在程序中的任何位置,既可以单独占用一行, ?也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:

#! /bin/sh

#

# 本程序说明

#

command_1 command_2 ? ? ? ? ? ? ? ? ?# command_2的语句说明

……

# 下面程序段的说明

command_m

……

command_n ? ? ? ? ? ? ? ? ?# command_n语句的说明

……

功能性语句(命令)

read从标准输入读入一行, 并赋值给后面的变量,其语法为:? ? ? ?

read ?var ? ? ?

把读入的数据全部赋给var ? ? ?

?read ?var1 ?var2 ?var3? ? ? (多个数据以空格隔开)

把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量. 如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。

read -p “想要打印的字符串”指定想要输入的提示

read -t n 等待输入n秒

?-s 是输入隐藏,密码。?

功能性语句(命令)

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如: ?

$ expr ?12 ?+ ?5 ?\* ?3? ?(加号两边没空格,则加号原样输出,不会进行运算。加号两边若有空格,则进行运算)

27 ?

$ expr ?3 ?- ?8 ?/ ?2 ?

-1 ?

$ num=9 ?

$ sum=`expr ?$num ?\* ?6 `? ?(expr不能直接赋值,要加``)

$ echo ?$sum ?

54

test语句可测试三种对象: ? ? ? ? ?

字符串 ? ? 整数 ? ? 文件属性

每种测试对象都有若干测试操作符

?字符串测试

s1 = s2 ? ?? ?测试两个字符串的内容是否完全一样 (条件成立0,条件不成立1)

s1 != s2?? ?测试两个字符串的内容是否有差异

-z s1 ?? ? ? ? ? ? ? ? 测试s1 字符串的长度是否为0

-n s1 ?? ? ? ? ? ? ? ? 测试s1 字符串的长度是否不为0(字符串变量外要加双引号)

?整数测试

a -eq b ?? ?测试a 与b 是否相等

a -ne b?? ??? ?测试a 与b 是否不相等

a -gt b ?? ??? ?测试a 是否大于b

a -ge b ?? ??? ?测试a 是否大于等于b

a -lt b ?? ??? ?测试a 是否小于b

a -le b ?? ??? ?测试a 是否小于等于b

?文件测试

-e name ? ?测试一个文件是否存在

-d name ? ?测试name 是否为一个目录

-f name ? ? 测试name 是否为普通文件

-L name ? ?测试name 是否为符号链接

-r name ? ? 测试name 文件是否存在且为可读

-w name ? 测试name 文件是否存在且为可写

-x name ? ?测试name 文件是否存在且为可执行

-s name ? ?测试name 文件是否存在且其长度不为0

f1 -nt f2 ? ?测试文件f1 是否比文件f2 更新

f1 -ot f2 ? ?测试文件f1 是否比文件f2 更旧

结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。

主要包括:

条件测试语句(两路分支)

多路分支语句

循环语句

循环控制语句等

文章来源:https://blog.csdn.net/ZhangPuYue0228/article/details/134831965
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。