什么是Shell
在 Linux 内核与用户之间的解释器程序
---通常指 /bin/bash
---负责向内核翻译及传达用户/程序指令
---相当于操作系统的“外壳”
Shell的使用方式
交互式 —— 命令行
---人工干预、智能化程度高
---逐条解释执行、效率低
非交互式 —— 脚本---需要提前设计、智能化难度大
---批量执行、效率高
---方便在后台静悄悄的运行
常见的Shell程序种类
如何切换 Shell 环境
---通过usermod、chsh更改登录 Shell
---手动执行目标 Shell 程序
查看所有可用的Shell
---cat /etc/shells
[root@pc2 ~]# cat /etc/shells
/bin/sh #多数 Unix 默认的 Shell
/bin/bash #多数 Linux 默认的 Shell
/usr/bin/sh
/usr/bin/bash
Bash基本特性
命令行环境回顾
---快捷键、Tab 键补齐
---命令历史
---命令别名
---标准输入输出
---重定向
---管道操作
Shell脚本
提前写好可执行语句,能够完成特定任务的文件
---顺序、批量化处理
---解释器程序
脚本编写规范
1、声明解释器(#!解释器路径)
2、注释(#可以描述脚本的功能,作者信息,变量作用等)
3、任务指令(可执行语句)
脚本执行方法
一、添加 x 权限,然后用相对路径或绝对路径执行
[root@pc2 opt]# cat test01.sh
#!/bin/bash
#测试脚本
echo ABC
echo nb
[root@pc2 opt]# chmod +x test01.sh
[root@pc2 opt]# /opt/test01.sh
ABC
nb
[root@pc2 opt]# ./test01.sh
ABC
nb
二、使用解释器执行,无需 x 权限,会开启解释器子进程
登录(root)——bash进程——bash进程——echo(脚本结束解释器子进程结束退出)
[root@pc2 opt]# cat test01.sh
#!/bin/bash
#测试脚本
echo ABC
echo nb
[root@pc2 opt]# chmod -x test01.sh
[root@pc2 opt]# /opt/test01.sh
-bash: /opt/test01.sh: 权限不够
[root@pc2 opt]# bash /opt/test01.sh
ABC
nb
[root@pc2 opt]# ls /bin/bash
/bin/bash
[root@pc2 opt]#
三、使用 source 或 . 命令执行,无需 x 权限,不会开启解释器子进程
调用系统当前Shell解释器程序,不开解释器子进程
登录(root)——bash进程——echo
[root@pc2 opt]# cat test01.sh
#!/bin/bash
#测试脚本
echo ABC
echo nb
[root@pc2 opt]# source test01.sh
ABC
nb
[root@pc2 opt]# . ./test01.sh
ABC
nb
source #当前正在使用的解释器
四、二与三比较
#!/bin/bash
#测试脚本
echo ABC
mkdir abc
cd abc
[root@pc2 opt]# source test01.sh
ABC
[root@pc2 abc]# pwd
/opt/abc
[root@pc2 abc]# cd ..
[root@pc2 opt]# ls
abc test01.sh
[root@pc2 opt]# rm -rf abc/
[root@pc2 opt]# ls
test01.sh
[root@pc2 opt]# bash test01.sh
ABC
[root@pc2 opt]# ls
abc test01.sh
[root@pc2 opt]# pwd
/opt
[root@pc2 opt]#
调试Shell脚本
主要途径
---直接观察执行中的输出、报错信息
---通过 bash -x 开启调试模式 -v选项
---在可能出错的地方设置echo
重定向
> 重定向标准输出
2> 重定向错误输出
&> 重定向所有输出
什么是变量
常量:固定不变的内容
以固定名称存放,可能会变化的值---提高脚本对任务需求、运行环境变化的适应能力
---方便在脚本中重复使用
变量的分类
一、自定义变量
由用户自主设置、修改及使用
名称可以用数字、字母、下划线,不能以数字开头,不能使用特殊符号,等号两边不能有空格,区分大小写
变量名=值
a=10 创建变量(对变量赋值)
a=20 对变量重新赋值
echo $a(echo $变量名) 调用变量
echo ${a}RMB 大括号可以防止变量名和常量混淆
变量的失效---退出定义变量的Shell环境时,变量会自动失效
---unset a(unset 变量名) 取消变量
a= 将变量 a 赋值为空,也相当于取消变量
二、环境变量
变量名通常都大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改
常见的环境变量
USER 当前用户名
UID 当前用户 id 号
HOME 当前用户家目录
SHELL 当前用户解释器
PWD 当前位置
HOSTNAME 主机名
PS1 一级提示符
PS2 二级提示符
PATH 存储了命令的路径
配置文件---/etc/profile(全局环境变量信息)
---~/.bash_profile(当前用户的环境信息,用户登录时读取)
相关操作---env:列出所有的环境变量
---set:列出所有变量
三、位置变量与预定义变量
bash内置,存储执行脚本时提供的参数
bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改
在执行脚本时提供的命令行参数
$1 脚本后第1个位置参数
$2 脚本后第2个位置参数
$3 脚本后第3个位置参数
用来保存脚本程序的执行信息
$0 当前所在的脚本名称或解释器进程
$* 所有位置变量的值
$# 已加载的位置变量的个数
$$ 随机的进程号(当前运行进程的PID号)
$? 可以检测上一个指令是否执行成功,0是正常,非0是异常(前一条命令执行后的返回状态)
$! 后台运行的最后一个进程的进程号
变量的作用范围
局部变量
---新定义的变量默认只在当前Shell环境中有效
---无法在子Shell环境中使用
全局变量---全局变量在当前Shell及子Shell环境中均有效
---使用 export 可将局部变量声明为全局变量
export 局部变量名[=变量值] #为局部变量添加全局属性
export -n 全局变量名 #取消指定变量的全局属性
区分三种定界符
' ' 界定范围 禁用扩展,即便 $ 也视为普通字符,可以屏蔽特殊符号的功能
" " 界定范围 允许扩展,以 $ 引用其他变量
` ` 或者 $() 将命令的执行输出作为变量值
read标准输入取值
一、read 从键盘读入变量值完成赋值
格式:read [-p "提示信息"] 变量名
选项:
--- -p 输出提示信息
--- -t 可指定超时秒数
--- -n 限制读取字符
二、终端显示控制
stty -echo(关闭终端输出——无显示)
stty echo(恢复终端输出——显示)
运算赋值
let 变量名=运算表达式
[root@pc2 ~]# a=1+1
[root@pc2 ~]# echo "$a"
1+1
[root@pc2 ~]# let a=1+1
[root@pc2 ~]# echo "$a"
2
[root@pc2 ~]# let a+=1
[root@pc2 ~]# echo "$a"
3
[root@pc2 ~]# let a+=5
[root@pc2 ~]# echo "$a"
8
[root@pc2 ~]#
整数运算,加减乘除 求模(取余)
一、expr 运算工具
计算指定的表达式,并输出结果
格式:expr 整数 运算符 整数
运算符两边需要有空格
乘法操作应采用 \* 转义,避免被作为Shell通配符
运算符
+加 -减 \*乘 /除 %取余(求模)
二、$[ ]或$(( )) 算式替换
使用 $[ ] 或 $(( )) 表达式
格式:$[整数 运算符 整数]
乘法操作 * 无需转义,运算符两侧可以无空格
自动识别变量,引用变量可省略 $ 符号
计算结果替换表达式本身,可结合 echo 命令输出
变量的自增/减操作
使用 $[ ] 替换,或者 let 命令来完成
结合 echo 命令查看结果
小数运算
整数运算的局限性
bash内建机制仅支持整数值运算
expr命令、$[ ] 算式替换 不支持有小数的运算
使用 bc 实现小数运算多数Linxu系统默认安装此工具
---支持高精度的数值运算
---直接运行bc可进入交互式运算界面,quit退出
---设置 scale=n 可约束小数位
结合管道向bc发送表达式
---多个表达式以分号分隔
---通过echo命令+管道传递要计算的表达式
[root@pc2 ~]# A=12.34
[root@pc2 ~]# echo "$A*56.789" | bc
700.776
[root@pc2 ~]# echo "scale=4;$A*56.789;5/3" | bc
700.7762
1.6666
[root@pc2 ~]#
小数值的比较
基本用法
---echo "数值1 比较符 数值2" | bc
---如果表达式成立,则返回的计算结果为1,否则返回0
---常见比较操作:>、>=、<、<=、==、!=