51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

shell 脚本语法

shell 是一种脚本语言,在Linux、Windows中都常用到,本文记录相关语法。

概述 {#概述}

shell 是一种脚本语言

  • 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译),是链接系统内核和用户的沟通渠道之一

  • shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
  • shell命令解析器:
  • 系统提供 shell命令解析器: sh ash bash
  • 查看自己linux系统的默认解析:echo $SHELL
  • Windows 查看sh命令路径
  • shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行

基本用法 {#基本用法}

开头:#!/bin/bash {#开头:-bin-bash}

#! 用来声明脚本由什么shell解释,否则使用默认shell

调用 {#调用}

  • 打开终端时系统自动调用:/etc/profile~/.bashrc

    • /etc/profile :文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置,开始自启动的程序,一般也在这里设置

    • ~/.bashrc:用户自己的家目录中的 .bashrc,登录时会自动调用,打开任意终端时也会自动调用

  • 命令行输入 sh,可以进入shell指令状态:

执行 {#执行}

  • 运行 shell 脚本需要当前用户具有可执行权限
  • 三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh

| 执行方式 | 含义 | |------------------------------|-------------------------------------------------| | ./xxx.sh | 优先按照 文件中#!指定的解析器解析,如果#!指定指定的解析器不存在 才会使用系统默认的解析器 | | bash xxx.sh | 指明先用bash解析器解析 如果bash不存在,才会使用默认解析器 | | . xxx.sh | 直接使用默认解析器解析 |

Windows 脚本在 Linux 运行 {#Windows-脚本在-Linux-运行}

Win脚本在Linux执行会报错,由于换行符定义不同,需要将windows文件 转换成 unix文件

  • 可以使用 dos2unix 插件调整脚本
  • 也可以使用 vi,执行 :set ff=unix,将文本转为 unix 格式

变量 {#变量}

普通变量 {#普通变量}

定义变量 {#定义变量}

不能有空格

引用变量 {#引用变量}
清除变量 {#清除变量}
只读变量 {#只读变量}
示例 {#示例}

交互输入变量 {#交互输入变量}

环境变量 {#环境变量}

  • 系统变量值可以直接使用 $ 获取

注意事项

  1. 变量名只能包含英文字母下划线,不能以数字开头
  2. 等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来
  3. 双引号 单引号的区别
    双引号:可以解析变量的值
    单引号:不能解析变量的值

修改环境变量 {#修改环境变量}

  • 以常用的修改系统路径为例

预设变量 {#预设变量}

shell直接提供无需定义的变量:

| 变量 | 含义 | |-------------------|---------------------------------------------------------------------| | $# | 传给 shell I脚本参数的数量 | | $* | 传给 shell 脚本参数的内容 | | $1、$2、$3 ... $9 | 运行脚本时传递给其的参数,用空格隔开 | | $? | 命令执行后返回的状态,用于检査上一个命令执行是否正确(在 Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。 | | $0 | 当前执行的进程名 | | $$ | 当前进程的进程号,变量最常见的用途是用作临时文件的名字以保证临时文件不会重复 |

脚本标量的特殊用法 {#脚本标量的特殊用法}

| 标记 | 含义 | |----------------|-----------------------------------------| | "" 双引号 | 包含的变量会被解释 | | '' 单引号 | 包含的变量会当做字符串 | | `(数字键1左面的反引号) | 反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量 | | \ 转义字符 | \n \t \r \a等 echo 命令需加转义并配上 -e 参数 | | (命令序列) | 由子shel来完成,不影响当前shel中的变量 | | {命令序列} | 在当前 shell E中执行,会影响当前变量 |

变量的扩展 {#变量的扩展}

判断变量是否存在 {#判断变量是否存在}
字符串的操作 {#字符串的操作}
  • 定义字符串
  • 测量字符串的长度 $
  • # 替换字符串str中的所有: ${str//:/#}

条件测试 {#条件测试}

  • test命令:用于测试字符串、文件状态和数字
  • test命令有两种格式:

使用方括号时,要注意在条件两边加上空格。

文件测试 {#文件测试}

  • 测试文件状态的条件表达式

| 参数 | 含义 | |------|--------| | -e | 是否存在 | | -d | 是否是目录 | | -f | 是否是文件 | | -r | 是否可读 | | -w | 是否可写 | | -x | 是否可执行 | | -L | 是否符号连接 | | -c | 是否字符设备 | | -b | 是否块设备 | | -s | 是否文件非空 |

  • 若返回为 True 则 $? 为0 否则非零
  • 若当前文件夹有文件 a

字符串操作符 {#字符串操作符}

| 操作符 | 含义 | |------|----------| | = | 两个字符串相等 | | != | 两个字符串不相等 | | -z | 是否是空字符串 | | -n | 是否是非空字符串 |

  • 语法
  • 返回值为 True 则 $? 为 0,否则非零

比较运算符 {#比较运算符}

| 运算符 | 英文 | 含义 | |-------|---------------|------| | -eq | equal | 相等 | | -ne | not equal | 不相等 | | -gt | greater than | 大于 | | -ge | greater equal | 大于等于 | | -le | less equal | 小于等于 | | -lt | less than | 小于 |

  • 返回值为 True 则 $? 为 0,否则非零

逻辑运算符 {#逻辑运算符}

| 运算符 | 英文 | 含义 | |-------------|-----|---------| | &&-a | and | 与操作 | | ` | | -o` | | ! | not | 非操作 |

控制语句 {#控制语句}

if {#if}

case {#case}

for {#for}

while {#while}

  • condition 为 True 时执行代码段,否则跳出 while 循环

until {#until}

  • condition 为 True 时跳出 until 循环,否则执行代码段

break {#break}

  • 跳出循环体

continue {#continue}

  • 跳出当前循环步骤,立即开启下一次循环

函数 {#函数}

定义函数 {#定义函数}

所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用

调用函数 {#调用函数}

  • 使用参数同在一般脚本中使用参数时相同,

    $1, $2, $3 ...

  • 可以使用 return 返回值

  • 默认无错误返回 0 ,否则返回 1

导入函数 {#导入函数}

  • fun.sh 中定义的函数可以在其他sh文件中引用:
  • 之后可以使用 fun.sh 文件中定义的函数

参考资料 {#参考资料}



文章链接:
https://www.zywvvd.com/notes/coding/shell/shell-usage/shell-usage/

赞(0)
未经允许不得转载:工具盒子 » shell 脚本语法