SHLL基础/变量/输入/运算/字符串截取

📅 2026/7/26 21:50:38
SHLL基础/变量/输入/运算/字符串截取
注释1单行注释#开头的一整行都是注释。2多行注释使用冒号“:”配合here document可实现多行注释例如:是 shell 内置空命令不执行任何操作是 Here Document此处文档语法作用是把多行文本重定向给前面的命令123是分界标识符开头标记和结尾标记必须完全一致下图展示了使用 Here Document 语法进行多行注释的示例gt;.sh是脚本语言文件的默认格式。第一行写声明声明当前的shell脚本使用哪个命令解释器去解释#!/bin/bash除了第一行以外的以#开头的行都为注释- shell脚本的作者- shell脚本的创建时间- 脚本的作用命令的说明#!释伴行Shebang必须写在脚本第一行顶端换行、空格都会失效作用告诉操作系统使用哪个解释器执行本脚本。如果没有 shebang 系统默认使用当前登录 shell 执行脚本# Date:创建日期 # Author:作者 # Mail:联系方式 # Function:功能 # Version:版本自动生成脚本开头注释方法当前用户专属 vim 配置文件~/.vimrc /root/.vimrcroot 用户、/home/用户名/.vimrc普通用户系统全局 vim 配置/etc/vimrc所有用户生效在对应的文件中加入代码autocmd BufNewFile *.py,*.cc,*.sh,*.java exec :call SetTitle() func SetTitle() if expand(%:e) sh call setline(1,#!/bin/bash) call setline(2,#########################) call setline(3,#File name:.expand(%)) call setline(4,#Version:v1.0) call setline(5,#Author:stu) call setline(6,#Email:admintest.com) call setline(7,#Created time:.strftime(%F %T)) call setline(8,#Description:) call setline(9,#########################) call setline(10,) endif效果执行vim test.sh新建 shell 脚本打开文件自动生成标准脚本头部模板无需手动重复书写。autocmd BufNewFile *.py,*.cc,*.sh,*.java exec :call SetTitle()自动命令新建后缀为.py/.cc/.sh/.java的文件时自动调用函数SetTitle()func SetTitle()~endfunc定义 Vim 自定义函数SetTitleif expand(%:e) shexpand(%:e)获取当前文件后缀名仅当新建文件后缀是.shshell 脚本才执行头部模板填充。call setline(行号,内容)往指定行写入文本第 1 行自动写入释伴行#!/bin/bash后续行自动填充脚本版权注释模板expand(%)获取当前文件名strftime(%F %T)获取当前系统时间年月日 时分秒shell的执行方式方法一使用sh或bash命令执行脚本文件不需要执行权限脚本中可以不指定解释器。执行的主体是解释器脚本作为解释器的参数。bash test.sh可以使用bash -n 脚本名,进行语法检测,且不执行脚本可以使用bash -x 脚本名,进行脚本执行跟踪,逐条语句的跟踪执行特点直接在命令行指定了bash/sh这个解释器程序让它去读取解析脚本文本操作系统不需要依靠脚本内部的 shebang 判断解释器。会开启新的子 Shell 进程运行脚本脚本内变量默认不影响当前终端环境。方法二切换到脚本所在目录使用./执行脚本,需要执行权限需要执行权限会开启新的子 Shell 进程运行脚本脚本内变量默认不影响当前终端环境。方法三绝对路径执行需要执行权限/test/test1.sh会开启新的子 Shell 进程运行脚本脚本内变量默认不影响当前终端环境。方法四使用点(.)或者source执行脚本,不需要执行权限. 脚本的绝对路径 或者进入脚本目录 . 脚本文件在当前shell进程中执行此脚本,而不是重新启动一个shell在子shell进程中执行此脚本,并且脚本中设置的变量在脚本执行完毕后会保存下来。理解1、bash test2.sh执行方式解释器调用执行原理新建子 Shell运行脚本。现象脚本内部执行cd /etc只改变子 shell 的目录子 shell 运行结束直接销毁不会影响当前终端。执行完仍停留在/root。权限要求不需要脚本具备x执行权限。2、./test2.sh执行方式路径直接运行原理新建子 Shell运行脚本系统读取脚本首行#!选择解释器。现象同样在子 shell 执行cd脚本结束子进程销毁当前终端目录不变依旧在/root。权限要求必须执行chmod x赋予脚本执行权限。3、/root/test2.sh本质和./test2.sh完全一致只是使用绝对路径书写。原理新建子 Shell运行脚本。现象cd仅作用于子 shell运行完毕回到/root。权限要求脚本必须拥有x执行权限。4、source test2.sh执行方式载入执行点命令. test2.sh等价原理不创建子 Shell脚本所有命令直接在当前终端进程执行。现象脚本里cd /etc直接修改当前终端工作目录执行完成后提示符切换到/etc。权限要求不需要脚本x执行权限。echo打印命令格式echo -参数 内容参数-n取消输出后行末的换行符号-e启用转义字符可以输出带颜色的字体变量变量定义规则1. 标准赋值语法变量名值等号两侧绝对不能加空格错误写法name linux正确写法namelinux2. 命名规范只能由字母、数字、下划线组成不能以数字开头区分大小写Name和name是两个变量不要和系统关键字重名if、for、while 等3. 带空格字符串赋值如果内容包含空格必须加引号# 双引号支持解析变量、转义字符 infohello ${name} # 单引号原样输出不解析任何变量、转义符 infohello ${name}变量引用$变量名基础用法namestudent echo $name${变量名}大括号界定边界作用区分变量名和后面相邻字符防止识别错误namestu # 错误shell会寻找变量namefile不存在 echo $namefile # 正确输出 stufile echo ${name}file变量查看与删除echo $变量名打印变量set查看所有变量自定义变量 环境变量unset 变量名删除自定义变量查看多个变量的值set 查看所有的变量和函数declare 查看所有的变量和函数env显示所有的全局变量$PATH 是其中之一变量作用域本地自定义变量直接namexxx定义只在当前 Shell 终端生效开启子 shellbash 脚本无法读取。环境变量全局变量export 变量名值定义子 Shell 进程可以继承读取。自定义环境变量export var或export varvalueexport变量名变量值declare -x varvaluedeclare x var//将环境变量变回自定义变量位置变量位置参数$# 总共有几个参数$0 当前脚本的名称$2表示脚本的第二个参数……$* 对应所有文职的参数值$ 以“参数1” “参数2” “参数3” 的形式返回所有参数的值$$ 返回本程序的进程IDPID$? 显示上一次命令的执行返回值$*与$区别当 $*和$没有被引用的时候它们确实没有什么区别都会把位置参数当成一个个体$*会把所有位置参数当成一个整体或者说当成一个单词如果没有位置参数则$* 为空如果有两个位置参数并且IFS 分隔符为空格时$*相当于$1 $2$会把所有位置参数当成一个单独的字段如果没有位置参数$#为0则$展开为空不是空字符串而是空列表如果存在一个位置参数则$相当于$1如果有两个参数则$相当于$1$2等等标准输入read可选参数-a array把读取的数据赋值给数组array从下标0开始。-d delimiter用字符串delimiter指定读取结束的位置而不是一个换行符读取到的数据不包括delimiter。-e在获取用户输入的时候对功能键进行编码转换不会直接显式功能键对应的字符。-n num读取num个字符而不是整行字符。-p prompt显示提示信息提示内容为prompt。-r原样读取Raw mode不把反斜杠字符解释为转义字符。-s静默模式Silent mode不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候这是很有必要的。-t seconds设置超时时间单位为秒。如果用户没有在指定时间内输入完成那么read将会返回一个非0的退出状态算术运算命令运算操作符与运算命令意义(())用于整数运算的常用运算符效率很高let用于整数运算类似于(())expr可用于整数运算但还有很多其他的额外功能bcLinux 下的一个计算器程序适合整数及小数运算$[]用于整数运算awkawk 既可以用于整数运算也可以用于小数运算declare定义变量值和属性-i参数可以用于定义整形变量做运算expr计算时候注意加空格let不运行有空格---最好用字符串长度计算字符串截取${变量名:起始下标:截取长度}start end:截取3个字符从下标1开始截取4个从一开始截取到尾部末尾开始截取从右往左第一次出现的 . 并截取左边部分从右往左最后一次出现的 . 并截取左边部分#从左往右