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可以定义结果是小数点后多少位