写点什么

Shell 编程学习(一)

作者:Studying_swz
  • 2022 年 9 月 25 日
    天津
  • 本文字数:2581 字

    阅读完需:约 8 分钟

Shell编程学习(一)

1.什么是 Shell


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

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

6. Shell 变量

1)普通变量

赋值:

a="川川帅哥"

打印

echo $a

2)只读变量

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

3)删除变量

c="川川菜鸟"

unset c

echo $c

7、Shell 字符串

1)单双引号

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

a='川川菜鳥'
b="川川帥哥"
echo $a
echo $b
复制代码

单引号特点:

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

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

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

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

2)字符串拼接

a="chuan"
b="chuan"
c=" $a$b"   #单引号或者双引号
echo $c
复制代码

3)获取字符串长度

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

4)字符串提取

a="chuan"

b="chuan"

c=" $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 来输出。

发布于: 刚刚阅读数: 2
用户头像

Studying_swz

关注

还未添加个人签名 2020.12.23 加入

还未添加个人简介

评论

发布
暂无评论
Shell编程学习(一)_Shell_Studying_swz_InfoQ写作社区