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
脚本的执行方式
- 方法一,作为‘命令字’
- 方法二,作为‘参数’
- 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或者其他值表示异常
- $#:已加载的位置变量的个数
- ∗ 或 *或 ∗或@:所有位置变量的值
位置变量:在执行脚本时提供的命令行参数
编辑一个快速创建用户的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 #取消指定变量的全局属性