Linux shell脚本基础 条件测试 for循环(Engineer01----DAY8)

妖精的绣舞 提交于 2019-12-23 06:50:08

什么脚本:一个可以执行文件,运行后可以实现某种功能

创建用户zhangsan useradd zhangsan

案例:书写hello.sh脚本
[root@server0 ~]# vim /root/hello.sh
echo hello world

[root@server0 ~]# /root/hello.sh
-bash: /root/hello.sh: 权限不够
[root@server0 ~]# chmod +x /root/hello.sh
[root@server0 ~]# ls -l /root/hello.sh
[root@server0 ~]# /root/hello.sh
hello world

#######################################################
规范Shell脚本的一般组成
• #! 环境声明,以下代码由那个程序进行翻译
• # 注释文本
• 可执行代码

1)输出当前红帽系统的版本信息
2)输出当前使用的内核版本
3)输出当前系统的主机名
[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

管道传递
• 使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理

重定向输出
>:正确信息的重定向(只收集前面命令的正确输出信息)
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 ~]# echo ‘
*
[root@server0 ~]# echo ’
? | &^%’

  • ? | &^%
    [root@server0 ~]#

#########################################################
案例:创建用户的脚本
黑洞设备:/dev/null

[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 ~]#

#########################################################

定义/赋值变量
• 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值

– 等号两边不要有空格
– 变量名只能由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符

查看/引用变量
• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}
[root@server0 ~]# b=10
[root@server0 ~]# echo $b

[root@server0 ~]# b=20
[root@server0 ~]# echo $b

[root@server0 ~]# b=CentOS
[root@server0 ~]# echo $b

[root@server0 ~]# echo ${b}7
#########################################################
• 根据变量的用途不同区分
环境变量 变量名一般都大写,用来设置用户/系统环境
位置变量 bash内置,存储执行脚本时提供的命令行参数
预定义变量 bash内置,可直接调用的特殊值,不能直接修改
自定义变量 用户自主设置、修改及使用

环境变量:变量名一般都大写,由系统定义完成,由系统赋值完成

USER=当前系统登陆的用户名
[root@server0 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 27: …root@server0 ~]#̲ su - student [… echo USERstudent[student@server0 ]USER student [student@server0 ~] exit
logout
[root@server0 ~]# useradd harry
[root@server0 ~]# su - harry
[harry@server0 ~]$ echo USERharry[harry@server0 ]USER harry [harry@server0 ~] exit
logout
[root@server0 ~]#

位置变量
• 在执行脚本时提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、… … 10{10}、{11}、… …

[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

预定义变量
• 用来保存脚本程序的执行信息
– 直接使用这些变量
– 不能直接为这些变量赋值

$# 已加载的位置变量的个数
$? 程序退出后的状态值,0表示正常,其他值异常

[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

#######################################################
条件测试及选择

– [ 测试表达式 ] #每一部分之间都要有空格

常用的测试选项
• 检查文件状态
-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 $?
0
#########################################################
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 [ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -eq 0 ];then…#个参数
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

#######################################################
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

##########################################################
列表式循环: 解决重复性操作

for循环结构

for 变量 in 值列表
do
重复执行的代码
done

for 献血车 in NSD1911全体同学
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

#########################################################

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!