4

shell编程基础 - 伍点

 1 year ago
source link: https://www.cnblogs.com/bfy0221/p/16546486.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

shell编程基础

shell名词解释

  • Kernel:Linux内核,主要是为了和硬件打交道
  • shell: 是一个命令行解释器,接收用户命令/应用程序,然后调用操作系统内核。还是一个程序设计语言。
  • 查看当前shell解释器和系统支持的shell解释器(我这里用的是centos7的镜像)
    2943439-20220803104810521-1630238211.png
  • shell的两大主流
    1. sh:
      Bourne shell(sh),Solaris,hpux默认shell
      Bourne again shell(bash),linux系统默认shell
    2. bash
      C shell(csh)
      tc shell(tcsh)

在Linux系统中,sh是bash的一个软链接(软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。)

#!声明
告诉系统其后路径所指定的程序是解释此脚本文件的shell程序,也就是指定shell解释器bash,路径是/bin/bash

shell脚本的执行

  1. 输入脚本的绝对路径或者相对路径

2943439-20220803111024172-450692236.png

2943439-20220803111317270-28324008.png

shell脚本文件的后缀是sh,这里使用vim创建并编辑内容后使用绝对路径执行helloword这个脚本没有权限,更改权限后使用绝对路径和相对路径都可以执行

  1. bash或sh+脚本的绝对路径或相对路径
    注意:当脚本没有x(执行)权限时,root和文件所属用户通过这个方式可以正常执行
    2943439-20220803112146811-1521925247.png

我这里已经将权限改成了不可执行,但是通过这个方式依然可以执行

  1. source+脚本的绝对路径或相对路径
    2943439-20220803112951227-1546233118.png

查看正在执行的进程
ps -ef

三种执行方式的区别
第一种和第二种在用bash解释器执行脚本时,会先生成一个新的bash,在新的bash中执行
第三种就是在一个bash中执行的,在后面的局部变量中也会体现

2943439-20220803142316558-1912023649.png

shell变量

  • 定义变量时,变量名不加$符号
  • 命名只能用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,不能使用标点符号
  • 不能使用bash里面的关键字(可以用help命令查看)

变量的类型

  • 局部变量
    局部变量在脚本或命令中定义,仅仅只在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量
    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行
2943439-20220803144012464-493074154.png
2943439-20220803144132599-1405390075.png

我在shell中定义了一个局部变量name,使用sh调用脚本,在脚本中打印这个局部变量没有显示,但是在脚本中定义的局部变量age却打印出来了,后面我使用export (作用是可以将当前进程的变量传递给子进程去使用)将局部变量name变成了环境变量,这时就可以打印了,造成这种情况的原因是因为前面sh调用脚本时,会先生成一个新的bash,在新的bash里面执行,此时我们在外面用命令定义的局部变量和bash执行的脚本不在同一个bash内,自然是打印不出来的,在当前shell是可以打印的。
[root@master01 scripts]# echo "${name}"
bfy

删除变量
unset

2943439-20220803145457016-784481486.png

shell的字符串
字符串可以用单引号,也可以用双引号,也可以不用引号
注意:

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  2. 单引号字符串中不能出现单独一个单引号,可以成对出现,作为字符串的拼接使用
  3. 双引号里可以有变量
  4. 双引号里可以出现转义字符
    2943439-20220803151409130-317140596.png
    2943439-20220803151427903-1197866118.png

这里的:<<!

  !
  是多行注释,使用时不局限于感叹号,EOF也可以,甚至是你自定义的字符
  在双引号中使用换行符时,需要加上-e

字符串长度
2943439-20220803154434877-1098506092.png

2943439-20220803154444091-1340241437.png

这里的#是取字符串长度,因为定义变量的时候不能取标点符号,所以没有打印
1:4是指从1开始,去四个字符,字符串是从0开始的

shell数组
bash支持一维数组,不支持多维数组,并且没有限定数组的大小
数组的下标从0开始,格式上与Java数组有所不同

2943439-20220803155930921-306286871.png
2943439-20220803155946932-2142121336.png

shell参数传递
执行shell脚本时,向脚本传递参数,脚本内获得参数的格式为:$n n代表一个数字

2943439-20220803160357778-358640728.png
2943439-20220803161118052-942026052.png
2943439-20220803161129166-782112921.png

这里前9个参数都正常,从第10个开始就发生了变化,原因是被默认成了10被默认成了1拼接上一个0,也就是110。解决办法是给10用大括号括起来。
2943439-20220803161610859-376264167.png

2943439-20220803161635691-1738184640.png

shell运算符
运算符的分类
算术运算符

2943439-20220803162618409-1914099632.png

expr是一款表达式计算工具,使用它能完成表达式的求值操作

(1)运算式或((运算式))或[运算式]
(2)expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
代码:

2943439-20220803164331571-1780991034.png

2943439-20220803164458776-33680066.png

2943439-20220803164827933-1431761966.png

关系运算符

2943439-20220803165256000-1563437848.png

= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

布尔运算符

2943439-20220803165633474-433894946.png

2943439-20220803165712883-833606536.png

字符串运算符

2943439-20220803165823493-134934043.png

(shell的echo指令用于字符串的输出,详情可以看我上一篇博客)

2943439-20220803170524844-791956250.png

shell流程控制
if判断
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif[ 条件判断式 ]
then
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格

2943439-20220803171601039-1204935351.png

read 读取控制台输入
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名

case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…

如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2)双分号“;;”表示命令序列结束,相当于java中的break。
3)最后的“
)”表示默认模式,相当于java中的default。

2943439-20220803172456670-951029864.png

for循环

for (( 初始值;循环控制条件;变量变化 ))
do
代码
done

2943439-20220803191639171-1217072423.png

while循环
while [ 条件判断式 ]
do
程序
done

2943439-20220803192945676-1536184631.png

break命令终止执行后面的所有循环
continue命令不会跳出所有循环,仅仅跳出当前循环

shell函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

2943439-20220803205144829-188610797.png
2943439-20220803205728056-1324357895.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK