当前位置: 首页 > news >正文

Shell脚本编程

shell概述

什么是shell?
  • 在Linux内核与用户之间的解释器程序
    • Linux默认解释器为/bin/bash
    • 负责向内核翻译及传达用户/程序指令
    • 相当于操作系统的“外壳”
      在这里插入图片描述
shell的使用方式
  • 交互式-命令行
    • 人工干预,智能化程度高
    • 逐条解释执行,效率低、
  • 非交互式-脚本
    • 需要提前设计,智能化难度大
    • 批量执行,效率高
    • 方便在后台静悄悄地运行
常见的shell程序种类
  • 如何切换Shell环境
    • 通过usermod,chsh更改登录shell
    • 手动执行目标Shell程序
[root@dc ~]#cat   /etc/passwd
xixi:x:1003:1005::/home/xixi:/bin/bash
[root@dc ~]#usermod   -s  /bin/sh   xixi   #更改xixi用户解释器
xixi:x:1003:1005::/home/xixi:/bin/sh
[root@dc ~]#cat   /etc/shells			#查看Linux系统解释器有哪些,可以再安装(例:ksh)
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

编写及执行脚本

什么是Shell脚本?
  • 提前写好可执行语句,能够完成特定任务的文件
    • 顺序、批量化处理
    • 解释型程序
    • 常见的脚本语言:bash,python,jsp,php,ruby等
  • 脚本创建“三步走”
    • 新建文本文件(shell脚本)
    • 添加可执行的脚本语句(命令行)
    • 添加x执行权限
[root@dc ~]#vim  /root/panda.sh
echo '* * * * *  /usr/bin/logger  panda' > /var/spool/cron/root     # 计划周期任务每分钟输出dc至/var/spool/cron/root,可在/var/log/message查看
[root@dc ~]#chmod  +x   panda.sh
[root@dc ~]#./panda.sh
规范的脚本构成
  • #!脚本声明(使用哪种解释器)
  • #注释信息(作者信息,步骤,思路,用途。变量含义等)
[root@dc ~]#vim  /root/panda.sh
#!/bin/bash
#description: this is a scrip
echo hello,word
[root@dc ~]#chmod  +x   panda.sh
[root@dc ~]#./panda.sh
脚本的执行方式
  • 方法一,作为‘命令字’
    • 指定脚本文件的路径,前提是有x权限
  • 方法二,作为‘参数’
    • bash 脚本文件路径
    • source 脚本文件路径
    • . 脚本文件路径
    • sh 脚本文件路径
调试Shell脚本
  • 主要用途:
    • 直接观察执行中的输出,报错信息
    • 通过sh -x 开启调试模式
    • 在脚本可能出错的地方设置echo
[root@dc ~]#vim  /root/panda.sh
#!/bin/bash
#description: this is a scrip
echo hello,word
[root@dc ~]#chmod  +x   panda.sh
[root@dc ~]#bash -x  panda.sh
+ echo hello,word
hello,word

Shell变量

什么是变量?
  • 以固定名称存放,可能会变化的值
    • 提高脚本对任务需求,运行环境变化的适应能力
    • 方便在脚本中重复使用
  • 定义/赋值变量命名注意事项:
    • 若指定的变量名义存在,相当于为此变量重新赋值
    • 等号两边不要有空格
    • 变量名由字母/数字/下划线组成,区分大小写
    • 变量名不能以数字开头,不能使用关键字和特殊字符
  • 定义/赋值/查看变量
    • 查看变量
      • 引用变量值:$变量名
      • 查看变量值:echo 变量名; e c h o 变量名 ; echo 变量名;echo{变量名}
[root@dc ~]# panda=1
[root@dc ~]#echo	$panda
1
[root@dc ~]#echo	$pandaRMB		#未定义的变量无取值
值为空
[root@dc ~]#echo	${panda}RMB	#变量名易混淆时,以{}界定
1RMB
  • 取消变量
    • 变量失效
      • 退出定义变量的shell环境时,变量会自动失效
      • 也可手动取消:unset 变量名
[root@dc ~]#panda=1
[root@dc ~]#echo	panda
1
[root@dc ~]#unset	panda
无输出

变量的种类

环境变量:变量名通常都大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改
  • 配置文件:/etc/profile ~/.bash_profile
  • 命令行查看环境变量:env:列出所有环境变量;set:列出所有变量
  • 常见的环境变量:PWD,HOSTNAME,PATH,UID,USER,SHELL,HOME
预定义变量:用来保存脚本程序的执行信息(1,直接使用此类变量;2,不能直接为这些变量赋值)
  • $0:当前所在的进程或脚本名
  • $$:当前运行进程的PID号
  • $?:命令执行后的返回状态,0表示正常,1或者其他值表示异常
  • $#:已加载的位置变量的个数
  • ∗ 或 *或 @:所有位置变量的值
位置变量:在执行脚本时提供的命令行参数
  • $n n为序号
编辑一个快速创建用户的shell脚本
[root@dc ~]#vim		quick_useadd.sh
read  -p 	请输入账号:    name
stty	-echo			#关闭命令行回显,保证密码输入安全
read   -p	请输入密码:  passwd			#也可使用    read   -sp	请输入密码:(此种情况输入密码也不会显示在命令行内)
stty  echo				#开启命令行回显
useradd	$name
echo  $?-------------			#通过执行结果为0或者其他数字查看命令是否执行成功
echo	$passwd		| 	passwd  --stdin	$name
echo  $?-------------			#通过执行结果为0或者其他数字查看命令是否执行成功
[root@dc ~]#chmod   +x  quick_useradd.sh
[root@dc ~]#./quick_useradd.sh

变量值及范围控制

扩展赋值操作
* 区分三种定界符* 双引号“”:允许扩展,以$引用其他变量* 单引号'':禁用扩展,即便$也视为普通字符* 反引号``:将命令的执行输出作为变量值,与$()等效,后者更方便嵌套
[root@dc ~]#panda=1
[root@dc ~]#echo	"当前数字是:$panda"
当前数字是1
[root@dc ~]#echo	'当前数字是:$panda'
当前数字是$panda
[root@dc ~]#echo	当前时间为:$(date +%F-%H)
当前时间为2025-06-01-17
举例:
[root@dc ~]#tar	-zcf		$(date +%F-%H).tar.gz		/etc/passwd			#归档并压缩文件
[root@dc ~]#ls
2025-06-01-17.tar.gz
read标准输入取值
  • read从键盘读入变量值完成复制
    • 格式:read [-p “提示信息”] 变量名
    • -p可选,-t可指定超市秒数
  • 终端显示控制
    • stty -echo #关闭终端输出(无显示,不要轻易尝试)
    • stty echo #恢复终端输出(显示)
  • 变量的作用范围
    • 局部变量:新定义的变量默认旨在当前shell环境中有效,无法在子shell环境中使用
    • 全局变量:全局变量在当前shell及子shell环境中均有效,可使用export将局部变量生命为全局变量(export 局部变量名[=变量值]:为局部变量添加全局属性;export -n 全局变量名:取消指定变量的全局变量)
[root@dc ~]#panda=1
[root@dc ~]#bash
[root@dc ~]#echo	$panda
无输出
[root@dc ~]#export		panda=1		#为局部变量添加全局属性
[root@dc ~]#bash
[root@dc ~]#echo	$panda
1			#有输出
[root@dc ~]#export	-n		panda		#取消指定变量的全局属性
http://www.lqws.cn/news/91189.html

相关文章:

  • 2025年微信小程序开发:趋势、最佳实践与AI整合
  • SpringBoot接入Kimi实践记录轻松上手
  • 博客摘录「 数据库系统概论课后习题答案(第五版 王珊、萨师煊)」2024年10月30日
  • 【C++高级主题】多重继承下的类作用域
  • OD 算法题 B卷【跳格子2】
  • CSRF攻击与防御
  • 快速了解GO+ElasticSearch
  • [Linux] MySQL源码编译安装
  • 工作自动化——工作自动提炼--智能编程——仙盟创梦IDE
  • 系统设计面试利器:The System Design Primer开源项目介绍
  • vue+cesium示例:地形开挖(附源码下载)
  • AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度
  • 【亲测有效】Mybatis-Plus中更新字段为null
  • PostgreSQL数据库备份
  • KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪
  • 数据库的操作
  • Oracle中的循环——FOR循环、WHILE循环和LOOP循环
  • 鸿蒙版Taro 搭建开发环境
  • 腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
  • Oracle 用户/权限/角色管理
  • Go基础|map入门
  • 【灵动Mini-F5265-OB】vscode+gcc工程创建、下载、调试
  • React从基础入门到高级实战:React 高级主题 - React 微前端实践:构建可扩展的大型应用
  • 如何监测光伏系统中的电能质量问题?分布式光伏电能质量解决方案
  • 【论文解读】ReAct:从思考脱离行动, 到行动反馈思考
  • 【Doris基础】Apache Doris中的Fragment概念详解
  • Vue3中使用Echarts图表步骤-demo
  • 通信算法之281:大疆DJI无人机ID-DJI DroneID开源工程-相关问题-协议信息问题
  • 20250603在荣品的PRO-RK3566开发板的Android13下的命令行查看RK3566的温度
  • 学习路之PHP--easyswoole使用视图和模板