1、shell脚本基础
1.1 shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
查看本机shell信息
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]#
1.3 脚本执行逻辑及执行方式
逻辑
1.顺序
2.选择
3.循环
执行方式
1.指定路径去执行文件(需要有执行权限)
2.指定shell解释器去执行(不需要执行权限)
1.4 脚本错误调试
1.命令错误
2.语法错误
3.逻辑错误 -- (只能自己去检查)
4.查看代码是否正确
bash -n 脚本名称 -- 检查语法错误
bash -x 脚本名称 -- 逻辑错误 -- 将脚本所有的语句执行一遍
5.set -e
在脚本前输入set -e 一旦出错立即停止
2、重定向和管道符
2.1 重定向
意思:不输出到默认设备上,输出到你指定的地点上(文件 其他输出设备)
| 类型 | 操作符 | 用途 |
|---|---|---|
| 重定向输入 | < | 从指定文件读取数据而不是从键盘输入 |
| 重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
| 追加 | >> | 将输出结果追加到指定文件的尾部 |
| 标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原文件内容) |
| 混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
| 追加标准错误输出 | 2>> | 标准错误输出结果追加到指定文件尾部 |
2.2 多行重定向
[root@localhost ~]# wc -l <<eof
> 123
> 35
> 45
> eof
3
[root@localhost ~]#
[root@localhost ~]# cat > ky15.txt
hhh
111
ky15
q
[root@localhost ~]# cat ky15.txt
hhh
111
ky15
q
[root@localhost ~]#
通过此来实现将内容写入文件
[root@localhost ~]# cat >1.txt <<eof
> 123
> gfy
> 456
> eof
[root@localhost ~]# cat 1.txt
123
gfy
456
[root@localhost ~]#
2.3 管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新
3、变量
3.1 read -p 从键盘输入的内容变成变量
3.2 export 定义全局变量
如果没有exort 那么开启一个新的bash 将不会继承定义的变量
[root@localhost opt]# abc=123
[root@localhost opt]# echo $abc
123
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
为空
[root@localhost opt]# exit
exit
[root@localhost opt]# echo $abc
123
[root@localhost opt]# export abc
#export 变量名 定义全局变量
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
123
4、条件语句
4.1 测试
test测试文件表达式 是否成立
格式1:test 条件表达式
格式2:[ 条件表达式 ]
注意[]空格,否则会失败
测试 是否成功使用 $? 返回值
[ 操作符 文件或目录 ]
help test
操作符
-d : 测试是否为目录
-e : 测试目录或文件是否存在
-f : 测试是否为文件
-r : 测试当前用户是否有权限读取
-w : 测试当前用户是否有权限写入
-x : 测试当前用户是否有权限执行
-L : 测试文件是否为软连接文件
属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组
例子:
[root@test1 ~]# test -d /etc/sysconfig
[root@test1 ~]# echo $?
0
[root@test1 ~]# test -f /etc/sysconfig
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ -d /etc/sysconfig/ ]
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -f /etc/sysconfig/ ]
[root@test1 ~]# echo $?
1
[root@localhost ~]# test -e qiuhe.sh &&echo "yes"
yes
4.2 比较整数的数值
-eq : 等于
-ne : 不等于
-gt : 第一个数大于第二个数
-lt : 第一个数小于第二个数
-le : 第一个数小于或等于第二个数
-ge : 第一个数大于或等于第二个数
4.3 字符串的比较
= : 字符串内容相同
!= : 字符串内容不同,!表示相反的意思
-z : 字符串内容为空
-n : 字符是否存在
[root@localhost data]#str1=wang
[root@localhost data]#str2=zhou
[root@localhost data]#[ $str1 = $str2 ]
[root@localhost data]#echo $?
1
4.4 逻辑测试 与 或
与 第一个要为真 第二个也要为真
一个为假就为假
cmd1 && cmd2
或
一真即为真
第一个为真 那么 不用执行第二个
第一个为假 才需要执行第二个
cmd1 || cmd2
4.5 if语句的结构
- 分支结构
单分支
if 判断条件;
then 条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
- case
格式
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
read -p i
case $i in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
- echo
echo -n 表示不换行输出
echo -e 表示输出转义符