Shell基础
-
Shell : 解释器
- 在Linux内核与用户之间的解释器程序
- 通常指 /bin/bash , 这是系统默认解释器
- 负责向内核翻译及传达用户/程序指令
- 相当于操作系统的 "外壳"
-
Shell的使用方式
-
交互式指令---------------命令行
- 人工干预
- 智能化程度高
- 逐条解析执行 , 效率低
-
非交互式指令---------------脚本
- 需要提前设计
- 智能化难度高
- 批量执行 , 效率高
- 方便在后台运行
-
-
bash : Tab键 , 快捷键 , 历史命令 , 支持别名 , 管道 , 重定向
-
shell脚本 : 提前写好可执行的语句 , 可以完成特定任务的文件顺序 , 批量化执行
-
cat /etc/shells # 查看所有的解释器
-
sh # 切换进入 sh 解释器
-
ksh # 切换进入 ksh 解释器
-
usermod -s /bin/ksh bilibili # 修改用户bilibili的解释器
Shell脚本
- 提前写好可执行语句 , 能够完成特定任务的文件
- 顺序 , 批量化处理
- 解释型程序
创建Shell脚本
-
创建文本文件
-
添加可执行的脚本语句 (命令行)
-
添加 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脚本
-
声明解释器
-
注释信息 ( 作者信息, 步骤 , 思路 , 用途 , 变量含义等 )
-
可执行语句 ( 操作代码 )
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
-
变量的种类
-
自定义变量
-
环境变量
-
预定义变量
-
位置变量
-
自定义变量
-
注意事项
-
若指定的变量名已存在,则相当于重新赋值
-
等号两边不要有空格
-
变量名由字母/数字/下划线组成 , 区分大小写
-
变量名不能以数字开头 , 不要使用关键字和关键字符
-
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 #列出所有变量
-
常见的环境变量
-
USER -----------#当前用户名
-
UID -----------#当前用户ID号
-
HOME -----------#当前用户家目录
-
SHELL -----------#当前用户解释器
-
PWD -----------#当前位置
-
HOSTNAME -----------#当前主机名
-
PATH -----------#存储了命令的路径
-
PS1 -----------#表示Shell环境的一级提示符 , 命令行提示符
-
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+2 --------- 加法
- $ a-b --------- 减法
- $ a \* b --------- 乘法
- $ a/b --------- 除法取整
- $ a%b --------- 触发取余 ( 求模 )
-
expr 运算工具
-
计算指定的表达式 , 并输出结果
- 格式 : expr 数字1 运算符 数字2
- 乘法操作使用 \\ \* 转义
- expr x + y
- expr x - y
- expr x \\ \* y
- expr x / y
- 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可以定义结果是小数点后多少位