1.什么是脚本:
一个可执行文件,运行后可以实现某种功能
2.shell脚本的一般组成:
• #! 环境声明,以下代码由那个程序进行翻译
• # 注释文本
• 可执行代码
3.运行脚本:
①.临时运行: bash 脚本名
②.永久运行: chmod +x 文件名(目录/文件名)
4.变量名的要求:
(类似与容器,以不变名称,储存可以变化的值)
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名只能由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
5.变量的种类:
①.环境变量,是系统自带的变量,变量名都是大写,用来统计一些参数
②.位置变量,是系统自带的变量,变量名都是数字( $ n), $ n代表运行脚本后面跟的第n个参数,$0代表脚本本身,$1代表脚本后面第一个参数
③.预定义变量,是系统自带的变量,可以直接使用,但不能直接给预定义变量赋值
④.自定义变量,自定义变量 用户自主设置、修改及使用
$?:判断上一条命令的执行结果,如果值为0,则代表上条命令执行成功,如果为非0则代表执行失败
$#:统计运行脚本时后面跟的参数的数量
环境变量:
[root@server0 ~]# echo $USER
root
[root@server0 ~]# su - student
[student@server0 ~]$ echo $USER
student
[student@server0 ~]$ exit
logout
[root@server0 ~]# useradd harry
[root@server0 ~]# su - harry
[harry@server0 ~]$ echo $USER
harry
[harry@server0 ~]$ exit
logout
[root@server0 ~]#
位置变量:
[root@server0 ~]# vim /root/1.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@server0 ~]# chmod +x /root/1.sh
[root@server0 ~]# /root/1.sh harry dcc tcc
[root@server0 ~]# vim /root/2.sh
#!/bin/bash
cat -n $1 | head -$2
[root@server0 ~]# chmod +x /root/2.sh
[root@server0 ~]# /root/2.sh /etc/passwd 3
[root@server0 ~]# /root/2.sh /etc/passwd 4
预定义变量:
[root@server0 ~]# vim /root/1.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $#
[root@server0 ~]# /root/1.sh haha xixi hehe
[root@server0 ~]# vim /root/3.sh
#!/bin/bash
echo 您一共输入了$#个参数
[root@server0 ~]# chmod +x /root/3.sh
[root@server0 ~]# /root/3.sh
[root@server0 ~]# /root/3.sh haha xixi
[root@server0 ~]# /root/3.sh a b c d
6.查看引用变量:
引用变量: $变量名
查看变量名: echo $变量名 . echo $ { 变量名}
7.条件测试:
[ 测试表达式 ] #每一部分之间都要有空格
常用的测试选项
①• 检查文件状态
-e:数据存在为真
-d:数据存在,且必须为目录才为真
-f:数据存在,且必须为文件才为真
[root@server0 ~]# [ -f /etc/passwd ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ -f /etc/haha ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ -f /etc/ ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ -d /etc/ ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ -e /xixi ]
[root@server0 ~]# echo $?
1
[root@server0 ~]#
②• 比较整数大小
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
[root@server0 ~]# [ 1 -ge 1 ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ 1 -gt 1 ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ 2 -eq 2 ]
[root@server0 ~]# echo $?
0
[root@server0 ~]#
③• 字符串比对
== :一致为真
!=:不一致为真
[root@server0 ~]# [ student == root ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ root == root ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ $USER == root ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ student != root ]
[root@server0 ~]# echo $?
④• 判断变量是否有值
-z 变量没值时为真
! -z 变量有值时为真
第一个脚本:
1)输出当前红帽系统的版本信息
2)输出当前使用的内核版本
3)输出当前系统的主机名
4)输出当前IP地址
[root@server0 ~]# vim /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2
[root@server0 ~]# /root/hello.sh
8.重定向输出:
>:正确信息的重定向(只收集前面命令的正确输出信息)
2>:错误信息的重定向(只收集前面命令的错误输出信息)
&>:混合重定向(收集前面命令的错误输出信息与正确输出信息)
[root@server0 ~]# cat /etc/redhat-release
[root@server0 ~]# cat /haha
[root@server0 ~]# cat /etc/redhat-release /haha
[root@server0 ~]# cat /etc/redhat-release /haha > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /etc/redhat-release /haha 2> /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /etc/redhat-release /haha &> /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
第二个脚本:
创建用户的脚本
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
useradd wangwu &> /dev/null
echo wangwu用户创建成功
echo 123 | passwd --stdin wangwu &> /dev/null
echo wangwu密码设置成功
[root@server0 ~]# chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
第三个脚本:
变量:
a=100
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
a=nsd05
useradd $a &> /dev/null
echo $a用户创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo $a密码设置成功
[root@server0 ~]# /root/user.sh
为了提高用户的体验,可以产生交互
read -p ‘屏幕输出信息’
1.产生交互
2.记录用户在键盘上所有输入
3.将记录的信息,赋值给一个变量储存
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
read -p '请输入您要创建用户名:' a
useradd $a &> /dev/null
echo $a用户创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo $a密码设置成功
[root@server0 ~]#
9.if双分支处理
if [条件测试];then
命令序列xx
else
命令序列yy
fi
[root@server0 ~]# vim /root/if01.sh
#!/bin/bash
if [ $1 -eq 1 ];then
echo hello
else
echo hi
fi
[root@server0 ~]# chmod +x /root/if01.sh
[root@server0 ~]# /root/if01.sh 1
[root@server0 ~]# /root/if01.sh 2
案例:判断用户是否输入命令行参数
[root@server0 ~]# vim /root/if02.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo 您没有输入参数
else
echo 您输入了$#个参数
fi
[root@server0 ~]# chmod +x /root/if02.sh
[root@server0 ~]# /root/if02.sh
[root@server0 ~]# /root/if02.sh haha xixi
案例:判断用户的脚本
利用read获取用户输入的用户名
进行判断:
如果用户输入的用户名存在,则输出用户已存在
如果用户输入的用户名不存在,则输出用户不存在并且创建该用户
[root@server0 ~]# vim /root/if03.sh
#!/bin/bash
read -p '请输入您要测试的用户名:' a
id $a &> /dev/null
if [ $? -eq 0 ];then
echo $a用户已存在
else
echo $a用户不存在
useradd $a &> /dev/null
echo $a已经创建成功
fi
[root@server0 ~]# chmod +x /root/if03.sh
[root@server0 ~]# /root/if03.sh
10.if多分支处理
if [条件测试1];then
命令序列xx
elif [条件测试2];then
命令序列yy
elif [条件测试3];then
命令序列aa
…
else
命令序列zz
fi
案例:判断用户成绩脚本
利用read获取用户的成绩
如果成绩大于等于90分以上,则输出 优秀
如果成绩大于等于80分以上,则输出 良好
如果成绩大于等于70分以上,则输出 一般
如果成绩大于等于60分以上,则输出 合格
如果以上条件均不满足,则输出 再牛的肖邦,也弹不出哥悲伤
[root@server0 ~]# vim /root/if04.sh
#!/bin/bash
read -p '请输入您的成绩:' a
if [ $a -ge 90 ];then
echo 优秀
elif [ $a -ge 80 ];then
echo 良好
elif [ $a -ge 70 ];then
echo 一般
elif [ $a -ge 60 ];then
echo 合格
else
echo '再牛的肖邦,也弹不出哥的悲伤'
fi
[root@server0 ~]# chmod +x /root/if04.sh
[root@server0 ~]# /root/if04.sh
11.列表式循环: 解决重复性操作
for循环结构
for 变量 in 值列表
do
重复执行的代码
done
[root@server0 ~]# vim /root/for.sh
#!/bin/bash
for a in zhangsan lisi wangwu dc tc haha xixi hehe
do
useradd $a &> /dev/null
echo $a创建成功
done
[root@server0 ~]# chmod +x /root/for.sh
[root@server0 ~]# /root/for.sh
案例``:编写一个判断脚本
在 server0 上创建 /root/foo.sh 脚本
1)当运行/root/foo.sh redhat,输出为fedora
2)当运行/root/foo.sh fedora,输出为redhat
3)当没有任何参数或者参数不是 redhat 或者fedora时
其错误输出产生以下信息: /root/foo.sh redhat|fedora
[root@server0 ~]# vim /root/foo.sh
#!/bin/bash
if [ "$1" == "redhat" ];then
echo fedora
elif [ "$1" == "fedora" ];then
echo redhat
else
echo "/root/foo.sh redhat|fedora" >&2
fi
来源:CSDN
作者:tian1345
链接:https://blog.csdn.net/tian1345/article/details/103442475