shell脚本基础
shell的作用
shell是linus中一个特殊的应用程序 他介于操作系统和用户之间 相当于一个翻译器及 将用户输入的操作命令进行解析,将需要执行的操作传达给内核,有内核进行各方面调度 最总也由shell来输出执行的结果
shell也由多种类型 , 不同的shell间器内部指令等也存在差异 。 通过/etc /shells文件来了解房前系统支持的shell脚本的类型,
cat /etc/shells
useradd -s [shell类型]
inux中常见的shell
-
bash:基于gun的框架下发展的shell
-
csh:类似c语言的shell
-
tcsh:整合了csh提供了更多功能
-
sh:已经被bash替换
-
nologin:让用户无法登录
-
目前绝大多数linux版本采用bash为默认shell
shell脚本的构成
1.将命令按顺序列出 保存于文件中 最后执行脚本 自动执行其中的命令
2.执行需要权限 可直接使用绝对路径
3.通过脚本环境改变后依然可以使用脚本
构成
脚本申明 (解释器) : 第一行开头的 ”#! /bin/bash“ 表示后续代码由/bin/bash程序来解释执行,也有其他类型的解释器 如 #! /bin/python #!/bin/expect
注释信息:以#开头的为注释信息 为解释命令用途 记录 警示等用处
可执行语句: 能实际执行 以达成最总目的的命令
(此处为以脚本形式搭建本地yum仓库)
变量作用范围
通常情况下 新定义的变量只在当前shell
命名要求
1.区分大小写
2.不能是程序中的保留字和一些内饰变量 如 if for hostname等
3.只能使用数字。字母下划线且不能以数字开头 不支持短横线 这点与主机名相反
4.尽量使用引文 使用词义通俗易懂
变量赋值 name=‘ct’ 变量名 = 变量值
变量入职时临时生效的无法永久生效 会随脚本结束自动删除
引用变量可是$name
${name}
变量强引用 及直接引用引号内的字符不会引用变量
总结
1.赋值时使用双引号“可直接调用变量“。
2.赋值时使用单引号会直接引用其中的字符 不会调用变量
3.赋值时使用``或()为调用其中命令执行结果
4.{}可用于分隔变量。
变量追加值
变量名+=追加值
在已存在变量中加入新的部分
read-p
提取键盘输入的内容为变量
整数的运算
expr只能进行证书的运算
环境变量
系统自行创建的,用来设置用户的工作环境
可使用env查看
需要记住的常见环境变量
常见变量
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
次一级变量都可使用上一级变量,但无发从父进程中使用子进程和孙子进程的变量
子进程修改了从父进程获得的变量就会传给孙子进程
一般只在系统配置文件中,脚本中少见
环境变量的全局配置文件
/etc/profile如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户
只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
预定义(状态)变量
$* 将所有参数看作一个整体返回所有
$@将单个参数作为一个个体 一个一个返回所有
条件语句
test 测试文件的表达式 是否成立
格式1:test 条件表达式
格式2:[ 条件表达式 ]
用 $? 查看返回上一次命令执行的结果
如果执行成功返回结果为0
失败返回结果为1
-d:测试是否为文件夹
-e:测试目录或文件是否存在
-f:测试是否为文件
-r:测试当前用户是否有权限读取
-w:测试当前用户是否有权限写入
-x:测试当前用户是否有权限执行
-L: 测试是否为软连接文件
比较整数数值
[ 整数1 选项 整数2 ] 与[ ] 中间要有空格
同于用$?查看结果 0为时 1为否
-eq 第一个是否等于第二个
-ne 第一个不等于第二个
-gt 第一个大于第二个
-lt 第一个小于第二个
-le 小于等于
-ge 大于等于
字符串与字符串间的比较
格式 [ 字符串1 = 字符串 2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
逻辑测试 (短路运算)
[ 表达式1 ] 操作符 [ 表达式2 ]
命令1 操作符 命令2
-a或&& 逻辑与 二者缺一不可 都真才为真 一个错误即可结束返回结果
-o或|| 逻辑或 二者满足一个即可 一个为真即可结束返回结果
!:逻辑否
ping 小脚本
-c 发送包的个数
-i 发送的间隔时间
-W 超时时间
-w 多少秒后停止ping操作
IF语句
结构
反分支
if 判断条件
then 条件为真的分支代码
fi
双分支
if 判断条件
else 为真条件
then 为假的条件
fi
多分枝
if 判断条件
then 为真的代码
elif 判断条件
then 为真的代码
elif 判断条件
then 为真的代码
...
fi
if [ "$USER" != "root" ]
then
echo "非管理员用户无权限操作"
else
echo "是管理员用户"
fi
case
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
变量为pat中的内容 可以时变量也可以时固定的数字相当于选项 选择及执行相关分支后续的命令
#!/bin/bash
read -p "请输入你的分数" score
case $score in
100)
echo "$score 你太优秀了"
;;
[89][0-9])
echo "$score 表现不错"
;;
[67][0-9])
echo "$score 你及格了"
;;
[0-9]|[1-5][0-9])
echo "$score 你不及格"
;;
*)
echo "输入有误"
esac
常用命令总结
cut
cut命令:提取想要的信息。
选项:
-d 指定分隔符 例如 cut -d ":"指定:为分隔符。
-f 选择第几列 例如 cut -f3 取第三列,-f1,3取第1列和第三列,-f1-3取1-3列。
sort
sort 排序
选项
-r 基于之前操作执行倒叙
-n 按数字大小排序 默认为按首字母排序
-t 指定分隔符
-k 指定列 如 -k 5