• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

Shell 编程

Data: 2022-02-28 14:06:24Form: JournalClick: 1

# Shell 编程

  • Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

# 一、什么是 Shell

  • Shell 本身功能并不是很丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在
  • Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展
  • Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令

图片


# 二、Shell 脚本

  • Shell 并不是简单的堆砌命令,还可以在 Shell 中编程
  • Shell 虽然没有 C++JavaPython 等强大,但也支持了基本的编程元素
    • if...else 选择结构,case...in 开关语句,for、while、until 循环
    • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念
    • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)

备:Shell 既是一种命令语言,又是一种程序设计语言,直接运行源码即可


# 三、Shell 作用

  • Linux 运维工程师 面对的是很多台服务器,总不能把同样的工作重复成很多遍吧
  • 服务器一旦多了,这些人力工作都需要自动化起来。例如服务的监控、代码快速部署、服务启动停止、数据备份、日志分析等
  • Shell 脚本很适合处理纯文本类型的数据,而 Linux 中几乎所有的配置文件、日志文件(如 NFS、Rsync、Httpd、Nginx、MySQL 等),以及绝大多数的启动文件都是纯文本类型的文件

# 四、命令行

# 1、命令行可以执行代码

# 输出php
echo php
# 输出 php中文网
echo 'php中文网'
# 输出 多行文本
echo "
php中文网
欧阳克
朱老师
"

# 2、文件执行代码

新建文件:test.sh

#!/bin/bash
echo php         # 输出php
echo 'php中文网'  # 输出 php中文网
# 输出 多行文本
echo "
php中文网
欧阳克
朱老师
"
  • 第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行;后面的/bin/bash 就是指明了解释器的具体位置
# 执行test文件
./test.sh

备:文件要有 执行权限


# 五、Shell 变量

  • 变量用来存放各种数据,任何一种编程语言都必不可少的组成部分
  • Shell 变量的命名规范和大部分编程语言都一样:
    • 变量名由数字、字母、下划线组成
    • 必须以字母或者下划线开头
    • 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)
    • 赋值号=的周围不能有空格

# 1、创建变量

url=https://www.php.cn
name='php中文网'
teacher="欧阳克"

# 2、使用变量

  • 变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo $url
echo ${name}
echo "我是讲师:${teacher}"

建议:给所有变量加上花括号{ },这是个良好的编程习惯

# 3、修改变量

teacher='朱老师'
echo "我是讲师:${teacher}"

# 4、变量只读

  • readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
readonly teacher
teacher='西门大官人'
echo "我是讲师:${teacher}"

# 5、变量删除

  • unset 命令可以删除变量
unset name
echo ${name}

# 六、字符串

# 1、单引号 和 双引号

  • 单引号里只保存纯字符串
  • 双引号里可以使用变量
echo '我是讲师:${teacher}'
echo "我是讲师:${teacher}"
  • 拼接字符串,不需要使用任何运算符
echo "大家好,这里是"$name',网址是:'$url",我是"$teacher

# 2、获取字符串长度

  • # 获取字符串长度
echo ${#url}

# 3、截取字符串

编号格式说明
1${string: start :length}从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
2${string: start}从 string 字符串的左边第 start 个字符开始截取,直到最后。
3${string: 0-start :length}从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
4${string: 0-start}从 string 字符串的右边第 start 个字符开始截取,直到最后。
5${string#*chars}从 string 字符串第一次出现 _chars 的位置开始,截取 _chars 右边的所有字符。
6${string##*chars}从 string 字符串最后一次出现 _chars 的位置开始,截取 _chars 右边的所有字符。
7${string%*chars}从 string 字符串第一次出现 chars_ 的位置开始,截取 _chars 左边的所有字符。
8${string%%*chars}从 string 字符串最后一次出现 chars_ 的位置开始,截取 _chars 左边的所有字符。
url=https://www.php.cn/course/list/33/type/2.html
# 从 url 左边第 2 个字符开始,向右截取 9 个字符
echo ${url: 5: 9}
# 从 url 左边第 5 个字符开始截取,直到最后
echo ${url: 5}
# 从 url 右边第 20 个字符开始,向右截取 10 个字符
echo ${url: 0-20: 10}
# 从 url 右边第 20 个字符开始,直到最后
echo ${url: 0-20}
# 从 url 第一次出现 *. 的位置开始,截取 *. 右边的所有字符
echo ${url#*.}
# 从 url 最后一次出现 *. 的位置开始,截取 *. 右边的所有字符
echo ${url##*.}
# 从 url 第一次出现 .* 的位置开始,截取 .* 左边的所有字符
echo ${url%.*}
# 从 url 最后一次出现 .* 的位置开始,截取 .* 左边的所有字符
echo ${url%%.*}

# 七、数组

  • 数组(Array)是若干数据的集合,其中的每一份数据都称为元素
  • Shell 并且没有限制数组的大小,理论上可以存放无限量的数据
  • Shell 数组元素的下标也是从 0 开始计数
  • 获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式
  • Shell 只支持一维数组,不支持多维数组

# 1、创建数组

# 创建数组
nums=(11 33 66 99)
# 创建不同类型值的数组
phpcn=('https://www.php.cn' 'php中文网' '欧阳克' 18)
# 指定下标创建数组
teacher=([1]='朱老师' [3]='西门大官人' [5]='欧阳')

# 2、获取数组元素

  • *@ 可以获取数组全部数据
# 输出数组第一个数据,数组默认下标从0开始
echo ${phpcn[1]}
# 输出下标数组
echo ${teacher[5]}
# 获取全部数据
echo ${nums[*]}
echo ${nums[@]}

# 3、修改数组

# 修改数组的值
teacher[5]='欧阳克'
# 添加数组的值
teacher[2]='猪哥'
echo ${teacher[*]}

# 4、删除数组

  • unset 删除数组元素
# 创建数组
nums=(11 33 66 99)
echo ${nums[*]}
# 删除数组
unset nums[0]
unset nums[1]
unset nums[2]
echo ${nums[*]}

# 八、运算符

# 1、算术运算符

编号运算符说明
1+加法
2-减法
3*乘法
4/除法
5%取余
6++自增
7--自减

原生 bash 不支持简单的数学运算

a=10
b=20
# 会当成普通字符串输出
echo 10+20
echo 10 + 20
echo ${a} + ${b}

# 2、数学计算命令

编号运算命令说明
1(( ))用于整数运算,效率很高,推荐使用。
2bcLinux 下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。
3let用于整数运算,和 (()) 类似。
4$[]用于整数运算,不如 (()) 灵活。
5expr可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。
6declare -i将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。
Name:
<提交>