Linux(四)——shell脚本

1 shell的本质

​ shell 的直译是贝壳:是内核的一种保护机制;用户和内核交互的桥梁;shell是命令行解释器(工具)

用户在命令行提示符下键入命令文本,开始与Shell进行交互。接着,Shell将用户的命令或按键转化成内
核所能够理解的指令控制操作系统做出响应,直到控制相关硬件设备。然后, Shell将输出结果通过Shell提
交给用户。
解释型语言
shell命令的有序集合
shell是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁

shell的基本步骤

基本过程分为三步:
1.建立shell文件
	包含任意多行操作系统命令或shell命令的文本文件;
	
2.赋予shell文件执行权限
	用chmod命令修改权限;
	
3.执行shell文件
	直接在命令行上调用shell程序.

2.shell变量及环境变量

1、shell变量

Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解
释为一串字符

3、变量类型

Bourne Shell有如下四种变量:
用户自定义变量
位置变量 即命令行参数
预定义变量
环境变量

自定义变量

#在shell编程中通常使用全大写变量,方便识别
$ COUNT=1

#变量的调用:在变量前加$
$ echo $HOME

#Linux Shell/bash从右向左賦值
$ Y=y
$ X=$Y
$ echo $X
y

#使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z

位置变量
$0 与键入的命令行一样,包含脚本文件名
$1、$2,……$9 分别包含第一个到第九个命令行参数
$# 包含命令行参数的个数
$@包含所有命令行参数: "$1,$2,......$9"
$?包含前一个命令的退出状态
$ *包含所有命令行参数: "$1,$2,......$9"
$$包含正在执行进程的ID号

常用shell环境变量
HOME: /etc/passwd 文件中列出的用户主目录

IFS: Internal Field Separator,默认为空格,tab及换行符

PATH: shell搜索路径

PS1, PS2:默认提示符($)及换行提示符(>)

TERM:终端类型,常用的有vt100,ansi,vt200,xterm等

3 功能性语句


shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:以#号开始到该行结束,不被解释执行

功能性语句:任意的shell命令、用户程序或其它shell程序。

结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。

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

常用功能性语句(命令)

read
read为从标准输入读入一行,并赋值给后面的变量,其语法为
read var 
#把读入的数据全部赋给var
read var1 var2 var3
#把读入行的第一个单词赋值给var1 ,第二个单词赋值给var2 ……把其余所有的词赋值给最后一个变
###如果执行read语句时标准输入无数据,则程序在此停留等侯,直到数据的到来或被终止运行。

read 选项
-p:用于显示提示消息,以引导用户输入。例如:read -p "请输入用户名:" username。

-s:用于将用户输入的字符隐藏,通常用于密码输入。例如:read -s -p "请输入密码:" password。

-n:用于限制输入的字符数。例如:read -n 4 -p "请输入验证码:" code,这将读取用户输入的前四个字符。

-t:用于设置读取超时时间,单位为秒。例如:read -t 5 -p "请在 5 秒内输入:" input,如果用户在 5 秒内没有输入,将退出读取。

-a:用于将用户输入的内容存储到一个数组中。例如:read -a names,这将读取一行输入,并将每个单词存储到名为 names 的数组中。

expr

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
$ expr 12 + 5\*3
#27
$ exp 3 - 8 / 2
#-1
$ num=9
$ sum=`expr $num \* 6`
$ echo $sum
#54

test 字符串测试

s1 = s2 测试两个字符串的内容是否完全一样

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

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

-n s1 测试s1 字符串的长度是否不为0

整数测试

a -eq 测试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旦不小于等于h

文件测试

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

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

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

-l name #测试name 是否为符号链接

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

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

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

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

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

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

test 命令使用

#方式一
test $name -eq $1
echo $?

#方式二
if test -f $filename
then
fi

#方式三
if [ -f $filename ]
then
	...
fi

5.echo命令使用

echo 是一个常用的命令,用于在终端上打印输出文本。它也有一些参数可以用来定制输出的行为。以下是几个常见的 echo 参数:

-n:不换行输出。默认情况下,echo 在输出完文本后会自动换行,使用 -n 参数可以禁止其换行。
例如:
echo -n "Hello, World!"

-e:启用转义字符解释。某些情况下,你可能需要使用一些特殊的字符,如换行符 \n,制表符 \t 等。
使用 -e 参数会解析转义字符。例如:
echo -e "Line 1\nLine 2"

-E:禁用转义字符解释。与 -e 相反,使用 -E 参数会禁止解析转义字符。例如:
echo -E "Line 1\nLine 2"

-s:禁止显示输入。通常用于密码输入,可以让用户输入时显示为空。例如:
echo -s "Please enter your password: " password。

-c:禁止显示命令。使用 -c 参数可以防止Shell在执行时将命令显示出来。例如:
echo -c "This is a secret command!"

4 shell控制语句

4.1 if条件语句

# if...then...else...fi
# 语法结构
if 表达式
then 命令表1
else 命令表2
fi

###如果表达式为真,则执行命令表1中的命令,再退出if语句;否则执行命令表2中的语句,再退出if语句.

无论表达式是否为真,都有语句要执行

结构性语句主要根据程序的运行状态、输入数据、变量取值、控制信号、运行时间等因素来控制程
序的流程。主要包括:条件测试语句(二路分支)、多路分支语句、循环语句、控制循环语句和后
台执行语句。

1)条件测试语句
1.if……then……fi语句
类似C语言的if语句,格式为:
if 表达式
then 命令
fi
如果表达式为真,则执行命令表中的命令,否则退出if语句。fi表示if语句的结束,类似C语言的
右括号}。fi和if必须成对出现。

2.if……then……else……fi语句
类似C语言的if-else语句,格式为:
if 表达式
then 命令1
else
命令2
fi
如果表达式为真,则执行命令表中的命令,否则执行else下命令。

3.if……then……elif……fi语句
类似C语言的if-else语句多重并列使用,格式为:elif
if 表达式1
then 命令1
elif 表达式2
then 命令2
……
else
命令n
fi

4.2 多路分支语句

# case...esac
# 多路分支语句case用于多重条件测试,语法结构清晰自然。语法为:
case 字符串变量 in   #case语句只能检测字符串变量
	模式1)     #各模式中可用文件名元字符,以右括号结束
		命令表1
		;;
	模式2|模式3)   #一次可以匹配多个模式用|隔开
		命令表2  
		;;        #命令表以单独的双分号结束,退出case语句
	模式n)
		命令表n  #模式n通常写为字符* 表示其他所有模式
		;;     #最后一个双分号可以省略
esac		

4.3 循环语句

# for...do...done
#当循环次数已知或确定时,使用for循环语句来多次执行一条或一组,命令。 循环体由语句括号do和done
来限定。格式为:
for 变量名 in 单词表   # 单词表海还可以为{1..5}或seq 1 5 都表示1到5
	do
		命令表
	done

变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令,
循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是由分号
或换行符分开的多条。如果单词表是命令行上的所有位置参数时,可以在for语句
中省略“in单词表”部分。

你可能感兴趣的:(嵌入式学习,Linux,linux)