当前位置: 首页 > 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.xdnf.cn/news/776953.html

相关文章:

  • java反序列化:CC5利用链解析
  • 由docker引入架构简单展开说说技术栈学习之路
  • pikachu靶场通关笔记12 XSS关卡08-XSS之htmlspecialchars(四种方法渗透)
  • SpringBoot中缓存@Cacheable出错
  • 机电工程常用设备
  • Spring AOP:面向切面编程 详解代理模式
  • C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析
  • Flink03-学习-套接字分词流自动写入工具
  • nginx+tomcat负载均衡群集
  • 设计模式-原型模式
  • 接口重试的7种常用方案!
  • 基于Python学习《Head First设计模式》第四章 工厂方法+抽象工厂
  • 【Zephyr 系列 4】串口通信进阶:打造自己的 AT 命令框架
  • 在树莓派3B上用Python编程完成流水灯实验
  • RAG理论基础总结
  • ps曲线调整
  • JavaSE:面向对象进阶之内部类(Inner Class)
  • 使用autoGen处理多agent
  • ps黑白调整
  • 碳中和新路径:铁电液晶屏如何破解高性能与节能矛盾?
  • 无线错误排查、排错命令
  • 【电赛培训课程】测量与信号类赛题知识点讲解与赛题解析
  • 2 Studying《Effective STL》
  • Day43 Python打卡训练营
  • 人工智能在智能制造业中的创新应用与未来趋势
  • 电磁场与电磁波公式汇总
  • PH热榜 | 2025-06-02
  • AIGC 基础篇 高等数学篇 01函数与极限
  • Arch安装botw-save-state
  • P1803 凌乱的yyy / 线段覆盖