Shell学习手册+笔记

        一、基础知识

1.命名规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

2.使用变量

只需要在变量名前加美元符号  $

your_name = dashuaige
echo $dashuaige
echo ${dashuaige}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界(最好加上,养成好习惯)。

3.只读变量

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

4.删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

5.获取字符串长度

str = "abcdefg"
echo ${#str} #输出为7

变量为字符串时,${#string} 等价于 ${#string[0]} 

5.1 提取子字符串长度

string = "Nice to meet you!"
echo ${string[1:4]}    #提取2到4的字符

5.2 查找子字符串

查找io,哪个字母先出现就先计算哪个

string = "Nice to meet you!"
echo `expr index "$string" io`    #输出为1

6.Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

6.1 定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。

格式为:数组一 = (元素1 元素2 ... ...)or array_name[0]=value0

                                                                    array_name[0]=value1

                                                                               ... ...

6.2 读取数组

${数组名[下标]}

使用 @ 符号可以获取数组中的所有元素

echo ${array_name[@]}

 6.3 获取数组的长度

获取数组长度与获取字符串长度的方法相同。

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}

7. 注释

#开头为注释

多行注释

:<

xxx

xxx

xxx

EOF

EOF可以被替换。

8.传递参数

        我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

Shell学习手册+笔记_第1张图片

图8.1 处理字符的特殊参数

$* 与 $@ 区别:printf "%.${n}f\n" "$VAR1"

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

Shell学习手册+笔记_第2张图片

9.Shell数组 

        数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

9.1 读取数组 

例:Shell学习手册+笔记_第3张图片

 运行结果:

:为什么加引号和不加引号输出的结果相同?

:引号通常用于保护字符串中的空格或特殊字符,以确保它们被视为一个整体。

9.2 关联数组 

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。

关联数组使用 declare 命令来声明,语法格式如下:

declare -A array_name
  •  -A 选项就是用于声明一个关联数组。
  •  关联数组的键是唯一的。

例:创建一个关联数组assoc_array,并创建不同的键值

# 定义关联数组
declare -A assoc_array
assoc_array["key1"]="value1"
assoc_array["key2"]="value2"

# 引用关联数组
echo ${assoc_array["key1"]}
echo ${assoc_array["key2"]}
 

输出结果为:

value1
value2
 

———————————————————未完待续——————————————————— 

 expr用法

$ expr "abcdef" : '.*' # 输出结果为6(表示字符串长度)

$ expr "abcdef" : 'abc' # 输出结果为1(表示字符串匹配成功)

$ expr "abcdef" : 'xyz' # 输出结果为0(表示字符串匹配失败)

$ expr index "abcdef" "c" # 输出结果为3(表示字符串中第一个字符"c"的位置)

$ expr substr "abcdef" 3 2 # 输出结果为"cd"(表示从第3个字符开始截取长度为2的子串)

_____________________________________________________________________________学习笔记

1.adduser+用户名         新增用户      
  passwd +用户名         修改新用户的密码

2.su - 用户名        切换用户

3.查看组:groups    赋予管理员权限:usermod -aG root + 用户名

4.例:linux下,给/home/test.txt文件赋予"-rw-r-x-wx"权限,所用命令为 chomod /home/test.txt 356

注:'-'代表文件;'rw-'代表用户拥有读写权限;'r-x'代表同组用户拥有读和执行权限;'-wx'代表其他用户拥有写和执行权限。r = 4 ; w = 2 ; x = 1.

5.要在home目录下创建一个以当前日期为名称的文件夹,可以使用以下命令:mkdir $(date +%Y-%m-%d)

6.压缩文件的两种方式:
(1)使用gzip命令"gzip hello_shell"这将创建一个名为hello_shell.gz的压缩文件,原始文件hello_shell将被替换。
解压:gzip -d hello_shell.gz
(2)"tar -czvf hello_shell.tar.gz hello_shell"这将创建一个名为hello_shell.tar.gz的压缩文件,原始文件hello_shell将被保留。
解压:tar -xzvf hello_shell.tar.gz

7.新建文件 vim + 文件名    编辑完成后 shift+:→ wq (保存退出)

8.创建新用户
adduser -m -g root -p +密码  用户名    -m:-m 是一个选项,用于在创建新用户时同时创建主目录。它表示在系统中创建一个新的主目录,并将其分配给新创建的用户。    -g:分组     groupadd:添加组    
crontad -e 定时    →例:0 0 * * * /bin/bash/to/123.sh

9.在写脚本时需注意[  ] 与字符之间要有空格,否则会报错。

Shell学习手册+笔记_第4张图片

10.注意图上注释的部分。 

Shell学习手册+笔记_第5张图片

———————————————————————————————————————————
                shell学习手册编写

v1.0

第一部分:Shell基础

  1. Shell 概述
  • 什么是Shell?

        Shell在计算机科学中,是一种命令行解释器,用于与操作系统进行交互和执行命令。它提供了一种交互式的方式,让用户可以通过命令来操作计算机,执行各种任务和管理系统资源。同时,Shell 脚本是一种使用 Shell 解释器执行的脚本文件,其中包含了一系列的命令和脚本语句。这些脚本可以用于自动化任务、批量处理、系统管理和编程等目的。常见的 Shell 解释器包括 Bash、Zsh、Csh、Ksh 等。

  • Shell 的分类(Bash、Zsh、Fish等)

Shell是一种命令行界面和脚本语言,有多种不同的实现和变种。这些不同的Shell可以根据其特性和功能进行分类。以下是一些常见的Shell分类:

 Bourne Shell (sh)

  • 简介:Bourne Shell是最早的Unix Shell,由Stephen Bourne创建。
  • 特点:具有基本的命令解析和控制结构。
  • 说明:大多数现代Shell都是Bourne Shell的扩展或变种。

 Bash(Bourne-Again Shell)

  • 简介:Bash是Bourne Shell的扩展,广泛用于Unix和Linux系统。
  • 特点:提供了命令历史、自动完成、别名等高级功能。
  • 说明:Bash通常是默认的系统Shell。

 Korn Shell (ksh)

  • 简介:Korn Shell是一种高级Shell,结合了Bourne Shell和C Shell的功能。
  • 特点:提供更强大的脚本编程能力。
  • 版本:有不同的版本,包括KSH88和KSH93。

 C Shell (csh)

  • 简介:C Shell以C语言风格的语法为特点。
  • 特点:具有命令别名、历史命令等功能。
  • 说明:在某些Unix系统中可用,但在脚本编程方面不如Bash和Ksh强大。

 Zsh(Z Shell)

  • 简介:Zsh是一种高度可定制的Shell,它扩展了Bash的功能。
  • 特点:具有更强大的命令补全、主题和插件支持。
  • 应用:在开发人员和高级用户中非常流行。

 Fish Shell

  • 简介:Fish Shell是一种用户友好的Shell,具有友好的自动完成和语法高亮功能。
  • 特点:对新手用户来说很容易上手。
  • 设计:具有现代化的设计和用户界面。

PowerShell

  • 简介:PowerShell是微软开发的强大的Shell和脚本语言。
  • 特点:主要用于Windows系统,但也有适用于Linux和macOS的版本。
  • 功能:具有广泛的系统管理和自动化功能。

其他Shell

  • 说明:此外,还有许多其他Shell的变种和实现,每个操作系统可能都有自己的定制Shell。
  • 应用:在嵌入式系统、特定工作流程和特殊环境中可能会使用自定义Shell。

        这些不同的Shell具有各自的特点和用途。选择使用哪种Shell取决于你的需求和个人偏好,不同的Shell可以用于不同的任务和工作流程。无论你是系统管理员、开发人员还是普通用户,理解这些Shell的分类和特性都将有助于更有效地使用和编写Shell脚本,最常见的就是Bash,本文主要介绍Bash。

  1. 基本Shell命令
  • 命令行界面的基础操作
  • 文件和目录操作(ls、cd、pwd、mkdir、rm、cp、mv等)
  • 文本处理工具(cat、grep、sed、awk等)
  • 文件权限和所有权(chmod、chown等)
  • 帮助命令(man、info、--help等
  1. 变量和环境
  • Shell变量(局部变量、全局变量)
  • 特殊变量($0、$1、$2等)
  • 环境变量($PATH、$HOME等)
  • 导出变量(export)
  1. 基本的流程控制
  • 条件语句(if、elif、else)
  • 循环(for、while等)
  • 退出与返回值

第二部分:Shell脚本编程 5. 编写简单的Shell脚本

  • 创建Shell脚本文件
  • 添加脚本头部
  • 注释和文档
  • 运行Shell脚本
  1. 字符串操作
  • 字符串拼接和替换
  • 字符串长度
  • 截取子字符串
  1. 数组
  • 创建和初始化数组
  • 数组遍历
  • 数组操作(增加、删除元素)
  1. 函数
  • 创建和调用函数
  • 函数参数和返回值
  • 局部和全局变量作用域

第三部分:高级Shell编程 9. 文件操作

  • 文件读写
  • 文件描述符
  • 文件测试和判断
  1. 正则表达式
  • 正则表达式基础
  • 使用正则表达式进行文本匹配
  1. 错误处理和调试
  • 错误处理机制
  • 调试Shell脚本
  • 日志记录
  1. 进程管理
  • 后台任务
  • 进程控制(kill、ps、top等)
  • 进程间通信
  1. Shell脚本最佳实践
  • 代码规范
  • 安全性和权限管理
  • 性能优化
  1. 高级主题
  • 正则表达式高级应用
  • Shell脚本中的网络操作
  • 使用外部工具和命令

第四部分:实际应用和项目 15. 实际项目

  • 编写一个简单的系统备份脚本
  • 创建一个日志分析工具
  • 自动化系统维护任务
  1. Shell编程资源
  • 学习更多的Shell工具和库
  • Shell编程社区和资源

—————————————————————分割线————————————————— 

先写到这,有时间再补充,太忙了。

你可能感兴趣的:(学习,笔记)