shell脚本

168 阅读3分钟

shell脚本

shell脚本基础

shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。

查看本机shell信息: cat /etc/shells

shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
  • 减少手工命令的重复输入,一定程度上避免人为错误
  • 将软件或应用的安装及配置实现标准化
  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

shell脚本构成

  • 将命令按顺序一一列出,最后自动执行
  • 执行需要权限,也可以直接使用绝对路径
  • 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本
  1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
  2. 注释信息:以#开头的语句表示为注释信息
  3. 可执行语句:比如echo命令用于输出“ ”之间的字符串

脚本执行逻辑与执行方式

脚本执行逻辑:

  1. 顺序执行:程序按从上到下顺序执行

  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

  3. 循环执行:程序执行过程中需要重复执行多次某段语句

执行方式

  1. 指定路径去执行文件(需要有执行权限)
  2. 指定解释器去执行(不需要权限)

ps:指定了使用 bash去执行脚本不需要权限

添加执行权限

将文件放在系统文件下

$PATH  //查看系统文件
cp [脚本文件] [系统文件路径]

使用 source sh 无需权限

脚本排错

bash -n [脚本文件]  //检查语法错误
bash -x [脚本文件]  //检查逻辑错误

脚本错文常见的三种区别

  1. 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
  2. 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
  3. 逻辑错误:只能使用 bash -x 进行

重定向与管道符

重定向

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

管道符

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

变量

常见变量类型:

  • 自定义变量:由用户自己定义,修改和使用
  • 环境变量:由系统维护,用于设置工作环境
  • 只读变量:只可以读取不可以更改
  • 位置变量:通过命令行给脚本传递参数
  • 预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用

变量命名规范

  • 区分大小写
  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

"" 弱引用,其中的变量引用会被替换为变量值
'' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

1.赋值时使用双引号(" ")可以直接调用变量

2.赋值时使用单引号(' ')只会被认为是字符只会被认为是字符 不会调用变量

3.赋值时使用``(反撇)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同

4.{}可以分隔变量值

read -p

从键盘输入的内容变成变量 image.png

image.png

image.png

变量作用范围

新定义的变量只在当前的shell环境中有效,因此称为局部变量

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

方法:

  1. 格式1:export 变量名
  2. 格式2:export 变量名=变量值

可以使用pstree 查看shell的环境

输入bash进入子shell

ctrl+D组合exit 退出子shell

环境变量

  1. 由系统提前创建,用来设置用户的工作环境
  2. 可以使用env查看环境变量
  3. 需要记住的常用环境变量

特点:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用

配置文件

/etc/profile 修改作用于所有用户

~/.bash_profile 用户独立的配置文件

只读变量

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

image.png

位置变量

位置变量也称为位置参数,使用11、2、33、…、9 表示

$0 表示当前脚本名

[root@jie ~]# vim 1.sh      
#!/bin/bash
echo "$1"            位置1
echo "$2"            位置2
echo "${10}"         位置10
echo "$10"           位置1和0
echo "$*"            将所有项当成一个值
echo "$@"            所有项
echo "$0"            脚本自身
echo "$#"            后面参数的个数
[root@jie ~]# ./1.sh {1..10}
1 
2
10
10
1 2 3 4 5 6 7 8 9 10

预定义变量

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字
  • "$$" (双$):当前进程id
  • $!: 后台任务最后一个id