SHELL(01)

Shell基础

  • Shell : 解释器

    • 在Linux内核与用户之间的解释器程序
    • 通常指 /bin/bash , 这是系统默认解释器
    • 负责向内核翻译及传达用户/程序指令
    • 相当于操作系统的 "外壳"
  • Shell的使用方式

    • 交互式指令---------------命令行

      • 人工干预
      • 智能化程度高
      • 逐条解析执行 , 效率低
    • 非交互式指令---------------脚本

      • 需要提前设计
      • 智能化难度高
      • 批量执行 , 效率高
      • 方便在后台运行
  • bash : Tab键 , 快捷键 , 历史命令 , 支持别名 , 管道 , 重定向

  • shell脚本 : 提前写好可执行的语句 , 可以完成特定任务的文件顺序 , 批量化执行

  • cat /etc/shells # 查看所有的解释器

  • sh # 切换进入 sh 解释器

  • ksh # 切换进入 ksh 解释器

  • usermod -s /bin/ksh bilibili # 修改用户bilibili的解释器

Shell脚本

  • 提前写好可执行语句 , 能够完成特定任务的文件
    • 顺序 , 批量化处理
    • 解释型程序
创建Shell脚本
  1. 创建文本文件

  2. 添加可执行的脚本语句 (命令行)

  3. 添加 x 执行权限

    vim /root/first.sh //创建shell脚本文件 /root/first.sh

    ----> echo 'Hello World' //可执行脚本(命令行)

    chmod +x /root/first.sh //给shell脚本添加可执行权限

    /root/first.sh / ./first.sh //绝对/相对路径执行shell脚本

设计Shell脚本
  1. 声明解释器

  2. 注释信息 ( 作者信息, 步骤 , 思路 , 用途 , 变量含义等 )

  3. 可执行语句 ( 操作代码 )

    vim /root/first.sh //执行shell的文件

    ----> #!/bin/bash //bash 调用标记

    ----> #A test program for Shell-Script //注释信息

    ----> echo 'Hello World' //可执行脚本语句/命令行

执行Shell脚本
  • 赋予 x 权限 读取解释器标记 , 根据标记选择解释器执行

    • 绝对路径执行

      /opt/first.sh

    • 相对路径执行

      ./first.sh

  • 无 x权限 不读取解释器标记 , 根据命令选择解释器执行

    • 调用解释器执行

      • 会开启解释器子进程 , 执行完后结束解释器子进程

      登录(root)----bash进程-----bash子进程----echo------结束bash子进程

      例:

      bash /opt/first.sh bash first.sh bash ./first.sh

      • 用解释器监控脚本执行

        bash -x /opt/first.sh

    • 使用 source 命令执行

      • 不会开启解释器子进程 , 执行完后不结束解释器进程
        登录(root)----bash进程-----echo
    • source 代表当前使用的解释器
      source /opt/first.sh source ./first.sh source first.sh

    • source 可以省略成 .
      .../first.sh

升级脚本
  • \> 重定向标准输出

    yum -y install vsftpd \> /bili.txt #把所有正确的输出内容写入文件

  • 2\> 重定向错误输出

    yum -y install vsftp \> /bili.txt #把所有错误回馈写入文件

  • \&\> 重定向所有输出

    yum -y install vsftpd \&\> /dev/null #把不需要显示的信息扔黑洞

Shell变量

变量的设置和取消
  • 变量 : 以固定名称存放 , 可能会变化的值

    • 提高脚本对任务的需求 , 运行环境变化的适应力提高
    • 方便在脚本中重复使用
  • 变量名 = 变量值 例: x=12 name1=szhou

  • 变量的种类

    • 自定义变量

    • 环境变量

    • 预定义变量

    • 位置变量

自定义变量
  • 注意事项

    1. 若指定的变量名已存在,则相当于重新赋值

    2. 等号两边不要有空格

    3. 变量名由字母/数字/下划线组成 , 区分大小写

    4. 变量名不能以数字开头 , 不要使用关键字和关键字符

    5. unset x / x= 取消 x 的变量设置

  • 引用 , 调用 变量的值 : $变量名

    • 查看变量值 : echo $变量名 echo ${变量名}
  • 例如 :

    • echo $x , $name1 -----------> 12 , szhou
    • echo $y.5 -----------> .5 #未定义的变量无取值
    • echo ${name1}.5 ------------> szhou.5 #变量名易混淆时 , 以 {} 界定
环境变量
  • 变量名称通常都大写 , 由系统维护 , 用来设置工作环境 , 只有个别变量用户可以修改

  • env #列出所有环境变量

  • 配置文件是 /etc/profile \~/.bash_profile

  • set #列出所有变量

  • 常见的环境变量

    1. USER -----------#当前用户名

    2. UID -----------#当前用户ID号

    3. HOME -----------#当前用户家目录

    4. SHELL -----------#当前用户解释器

    5. PWD -----------#当前位置

    6. HOSTNAME -----------#当前主机名

    7. PATH -----------#存储了命令的路径

    8. PS1 -----------#表示Shell环境的一级提示符 , 命令行提示符

    9. PS2 -----------#表示Shell环境的二级提示符 , 出现在强制换行场合

预定义变量和位置变量
  • 位置变量 : 在执行脚本时提供的命令参数

  • 表示为 1 , 2 , 3 , ... , {10} , ${11} , ...

  • 例 : bash -x /bilibili/1.sh 1 2 55 66 77 88 99

    ---------->echo $1

    ---------->echo $2

    ---------->echo $3

    =======> 1 2 55

  • 预定义变量 : 用来保存脚本程序的执行信息

    • 直接使用这些变量
    • 不能直接为这些变量赋值
      • $0 ----------> 当前所在进程或脚本名
      • $$ ----------> 当前运行进程的PID号
      • $? ----------> 命令执行后的返回状态 , 0表正常 , 1或其他表异常
      • $# ----------> 已加载的位置变量的个数
      • $\* ----------> 所有位置变量的值
      • $! ----------> 现在UID
变量值及范围控制
  • 区分变量的三种定界

    • " " 双引号 : 允许扩展 , 以 $ 引用其他变量
      • xx="a b c $1"
    • ' ' 单引号 : 禁止扩展 , 即便 $ 也视为普通字符
      • echo '$test'
    • \`\` 反撇号 : 将命令的执行输出作为变量值 . $() 同效.
      • a=$(ls)
  • read 标准输入取值

    • read 从键盘读入变量值完成赋值
    • 格式 : read -p "提示信息" 变量名
    • -p 可选 , -t 可指定超时秒数

    read -p "请输入密码 :" n_passwd

    -----------> 请输入密码 :

    ------------> 123456789

    echo $n_passwd

    ----------> 123456789

  • stty 终端显示控制

    • stty -echo 将回显功能关闭
    • stty echo 将回显功能恢复
  • export 发布全局变量scale=2;

    • 默认下 , 自定义变量为局部变量 , 只在当前Shell环境中生效 , 其他子Shell环境不认可
    • 使用 export bilibili 发布已定义的变量 ** , 使其变成全局变量**
计算
  • 基础整数运算 , 直接调用结果 , 需要 echo 等其他函数

  • 引用变量可省略 $ 符号

    1. $ 1+2 --------- 加法
    2. $ a-b --------- 减法
    3. $ a \* b --------- 乘法
    4. $ a/b --------- 除法取整
    5. $ a%b --------- 触发取余 ( 求模 )
  • expr 运算工具

  • 计算指定的表达式 , 并输出结果

    • 格式 : expr 数字1 运算符 数字2
    • 乘法操作使用 \\ \* 转义
      1. expr x + y
      2. expr x - y
      3. expr x \\ \* y
      4. expr x / y
      5. expr x % y
  • let 其他方式只能计算 , let命令可以直接对变量值做运算再保存新的值

常规写法 主流写法

let a=a+1 let a++ #变量a加1

let a=a-1 let a-- #变量a减1

let a=a+10 let a+=10 #变量a加10

let a=a-10 let a-=10 #变量a减10

let a=a*2 let a *=2 #变量a乘以2

let a=a/2 let a/=2 #变量a除以2

let a=a%3 let a%=3 #变量a除以3取余数

  • bc

bc非交互式运算

将需要运算的表达式通过管道操作交给bc运算。注意,小数位的长度可采用scale=N限制。

echo "1.1+1" \| bc

echo "scale=2;10/3" \| bc #scale可以定义结果是小数点后多少位

相关推荐
漂流瓶jz5 小时前
Webpack如何实现万物皆可import?loader的使用/配置/手写实践
前端·javascript·webpack
ZC跨境爬虫6 小时前
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
前端·javascript·css·ui·交互
修己xj7 小时前
告别手动存图!这款叫 Fatkun 的浏览器插件,简直是素材收集神器
前端
袋鼠云数栈7 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
AskHarries7 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment8 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
qcx238 小时前
【系统学AI】25 论文导读 ①:两篇改变 AI 的开山之作——Attention Is All You Need & ReAct
前端·人工智能·react.js·transformer
kyriewen9 小时前
大文件上传最全指南:分片、断点续传、秒传,一篇就够了
前端·javascript·面试
郑洁文10 小时前
基于Python的Web命令执行漏洞自动化检测系统
前端·python·网络安全·自动化
新酱爱学习10 小时前
手搓 10 个 Skill 后,我把重复劳动收敛成了一套零依赖 CLI 工具
前端·javascript·人工智能