Shell 编程学习(一)

举报
Studying-swz 发表于 2022/10/07 20:32:19 2022/10/07
【摘要】 1.什么是Shellshell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给予用户看到结果。从我们登录linux,输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行。2.Shell是运维人员必须掌握的技能2016 年初国内服务器端各个操作系统的市场份额:正是由于 Linux ...

1.什么是Shell
image.png

shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给予用户看到结果。

从我们登录linux,输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行。

2.Shell是运维人员必须掌握的技能

2016 年初国内服务器端各个操作系统的市场份额:

正是由于 Linux 服务器的大规模应用,才需要一批专业的人才去管理,这群人就是Linux 运维工程师(OPS)。

OPS 这项工作的细节内容包括:

安装操作系统,例如 CentOS、Ubuntu 等。

部署代码运行环境,例如网站后台语言采用 PHP,就需要安装 Nginx、Apache、MySQL、PHP 运行时等。

及时修复漏洞,防止服务器被攻击,这包括 Linux 本身漏洞以及各个软件的漏洞。

根据项目需求升级软件,例如 PHP 7.0 在性能方面获得了重大突破,如果现在服务器压力比较大,就可以考虑将旧版的 PHP 5.x 升级到 PHP 7.0。

监控服务器压力,别让服务器宕机。例如淘宝双十一的时候就会瞬间涌入大量用户,导致部分服务器宕机,网页没法访问,甚至连支付宝都不能使用。

分析日志,及时发现代码或者环境的问题,通知相关人员修复。

对于一些常见的系统脚本,使用 Shell 开发会更简单、更快速,例如,让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,它们可能就不如 Shell 脚本流行以及有优势了。对于一些常见的业务应用,使用 Shell 更符合 Linux 运维简单、易用、高效的三大原则则。

3.什么是Shell脚本

当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为Shell脚本。

在shell脚本里定义多条Linux命令以及循环控制语句,然后将这些Linux命令一次性执行完毕,执行脚本文件的方式称之为:非交互式方式。

indows中存在*.bat批处理脚本

Linux中常用*.sh脚本文件

代码块:

#!/bin/bash     : Shebang指的是出现在文本文件的第一行前两个字符#!

在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如:

其中/bin/sh指向/bin/bash。

4.Shell命令的基本格式

command [选项] [参数]

[]表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数

5.运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限

./test.sh  #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh

/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

  1. Shell变量

1)普通变量

赋值:

a=“川川帅哥”

打印:

echo $a

2)只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

3)删除变量

c=“川川菜鸟”

unset c

echo $c

7、Shell 字符串

1)单双引号

字符串可以用单引号,也可以用双引号,也可以不用引号。

a=‘川川菜鳥’

b=“川川帥哥”

echo $a

echo $b

单引号特点:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号特点: - 双引号里可以有变量 - 双引号里可以出现转义字符

注:我们可以理解双引号中,直接引入 n a m e 变量是可以的,而单引号是不行的;但是双引号和单引号中如果有其他的单引号 / 双引号包含的 name变量是可以的,而单引号是不行的;但是双引号和单引号中如果有其他的单引号/双引号包含的 name变量,是可以的,理解为字符串拼接。

2)字符串拼接

a=“chuan”

b=“chuan”

c=" a a b"   #单引号或者双引号

echo $c

3)获取字符串长度

在上面的基础之上加上echo ${#c}即可:

4)字符串提取

a=“chuan”

b=“chuan”

c=" a a b"

echo $c

echo ${#c}

echo ${a:1:3}  #从索引为1的开始,截取长度为3de

8、Shell 数组

1)读取索引数组

Shell 数组用括号来表示,元素用空格符号分割开。 sh文件内容为:

a=(A B “C” D)

echo $a

结果:

A

但是你是否在疑惑只输出的第一个,shell里我们不能像别的语言一样,直接输出全部,因此我们要修改一下。 改为这样:

a=(A B “C” D)

echo ${a[0]}

echo ${a[1]}

echo ${a[2]}

echo ${a[3]}

2)获取数组中的所有元素

如果想一次性全部输出,并不想通过索引来输出怎么办?使用@ 或 * 可以获取数组中的所有元素,在上面的基础上我再编辑加两行:

a=(A B “C” D)

echo ${a[0]}

echo ${a[1]}

echo ${a[2]}

echo ${a[3]}

echo “數組元素依次如下:${a[@]}”

echo “數組元素依次如下:${a[*]}”

3)获取数组的长度

在前面的基础之上加上#:

echo “數組元素個數爲:${#a[@]}”

echo “數組元素個數爲:${#a[*]}”

9、shell运算符

算术运算符

演示其中一部分,其它则类似:

a=10

b=20

val=expr $a + $b

echo “a + b : $val”

val=expr $a - $b

echo “a - b : $val”

val=expr $a \* $b

echo “a * b : $val”

val=expr $b / $a

echo “b / a : $val”

val=expr $b % $a

echo “b % a : $val”

if [ $a == $b ]

then

echo “a 等于 b”

fi

if[ $a != $b ]

then

echo “a不 等于 b”

fi

注意事项:

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被 两个反引号 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

乘号(*)前边必须加反斜杠()才能实现乘法运算;

if…then…fi 是条件语句,后续将会补充讲解。

10、Shell echo命令

1)显示普通字符串

echo “hello world”

2)显示转义字符

echo ““hello world””

3)显示换行

echo -e “hello\n”  #-e 开启转义

4)显示不换行

echo -e “chuan! \c” # -e 开启转义 \c 不换行

5)显示结果重定向至文件

定向至test7.sh文件:

echo “hello world” >test7.sh

6)显示执行时间

echo date

这里又到了最后了,补充一下printf跟echo命令是一样的作用,因此我就不演示了,统一用echo来输出。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。