8.shell脚本 基础中的基础!!!!!!!!!

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

发布了37 篇原创文章 · 获赞 48 · 访问量 1695

猜你喜欢

转载自blog.csdn.net/tian1345/article/details/103442475