SHELL 脚本基础从放弃到入门(一)

本文详细介绍Shell脚本的基础知识,包括脚本的编写、测试、变量定义与使用、条件测试、循环处理以及如何创建实用的脚本来解决实际问题。

什么是Shell脚本
• 提前设计可执行语句,用来完成特定任务的文件
– 解释型程序
– 顺序、批量执行

案例1:Shell脚本的编写及测试

  1. 编写一个面世问候 /root/helloworld.sh 脚本
    – 显示出一段话 Hello World

[root@server0 ~]# vim /root/hello.sh
echo Hello World
[root@server0 ~]# chmod +x /root/hello.sh #赋予执行权限

[root@server0 ~]# /root/hello.sh #绝对路径运行

规范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 /xixi

[root@server0 ~]# cat /etc/redhat-release /xixi

]# cat /etc/redhat-release /xixi > /opt/1.txt
]# cat /opt/1.txt

]# cat /etc/redhat-release /xixi 2> /opt/2.txt
]# cat /opt/2.txt

]# cat /etc/redhat-release /xixi &> /opt/3.txt
]# cat /opt/3.txt

####################################################
案例:书写一个创建用户设置密码的脚本
/dev/null:黑洞设备

[root@server0 ~]# vim /root/user.sh
#!/bin/bash
useradd nsd04 &> /dev/null
echo 用户nsd04创建成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 用户nsd04密码设置成功
[root@server0 ~]# chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

为了让脚本,适应多变需求,所以使用变量

变量:会变化的量 类似容器
以不变的名称,存储可以变化的值

定义变量:
变量名=存储的值

使用变量储存的值: $变量名

[root@server0 ~]# vim /root/user.sh
#!/bin/bash
a=dc
useradd KaTeX parse error: Expected 'EOF', got '&' at position 4: a &̲> /dev/null ech…a创建成功
echo 123 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 4: a &̲> /dev/null ech…a密码设置成功

提高用户体验度,产生交互
read
1.直接产生交互,等待用户输入
2.记录用户在键盘上的输入
3.将记录的内容,赋值给一个变量储存
-p ‘屏幕提示信息’

[root@server0 ~]# vim /root/user.sh
#!/bin/bash
read -p ‘请您输入要创建的用户名:’ a
read -p ‘请您输入要设置的密码:’ b
useradd KaTeX parse error: Expected 'EOF', got '&' at position 3: a &̲> /dev/null ech…a创建成功
echo $b | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 3: a &̲> /dev/null ech…a密码设置成功

[root@server0 ~]#

什么是变量
• 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力

定义/赋值变量
• 设置变量时的注意事项
– 等号两边不要有空格
– 变量名只能由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
– 若指定的变量名已存在,相当于为此变量重新赋值

以下有效变量名为: B
A.2008file B.tun_01 C a-b D a_ccd_9-abc

查看/引用变量
• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}

[root@server0 ~]# a=rhel
[root@server0 ~]# echo $a
rhel
[root@server0 ~]# echo $a7

[root@server0 ~]# echo ${a}7
rhel7

################################################
单引号’ ':取消所有特殊字符的意义,原样输出
[root@server0 ~]# echo ‘********’


[root@server0 ~]# echo '| ? * {} [] > ’
| ? * {} [] >
[root@server0 ~]#

反撇号 或 $( )
:将命令的输出,直接参与另一条命令的运行,作为另一条命令的参数
[root@server0 ~]# mkdir /opt/nsddate +%F
[root@server0 ~]# ls /opt/
[root@server0 ~]# mkdir /opt/hostname-date +%F
[root@server0 ~]# ls /opt/

[root@server0 ~]# mkdir /opt/abc-$(date +%F)
[root@server0 ~]# ls /opt/
###################################################

环境变量
变量名为大写字母,由系统定义并且赋值完成

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 ~]USERstudent[student@server0 ] exit
logout
[root@server0 ~]# su - nsd01
[nsd01@server0 ~]$ echo USERnsd01[nsd01@server0 ]USER nsd01 [nsd01@server0 ~]USERnsd01[nsd01@server0 ]

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

位置变量
• 由系统定义并且赋值完成
• 在执行脚本时提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、… … 10、{10}、10{11}、… …

[root@server0 ~]# vim /root/user.sh
#!/bin/bash
#read -p ‘请您输入要创建的用户名:’ a
#read -p ‘请您输入要设置的密码:’ b
useradd $1 &> /dev/null
echo 用户$1创建成功
echo 123 | passwd --stdin $1 &> /dev/null
echo 用户$1密码设置成功
[root@server0 ~]# /root/user.sh natasha

[root@server0 ~]# vim /root/1.sh
#!/bin/bash
cat -n $1 | head -$2
echo 您输入的文件为$1
echo 显示文件内容的头$2行
[root@server0 ~]# /root/1.sh /etc/passwd 3
####################################################

预定义变量
• 由系统定义并且赋值完成
$# 已加载的位置变量的个数
$? 程序退出后的状态值,0表示正常,其他值异常

[root@server0 ~]# vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $#
[root@server0 ~]# chmod +x /root/2.sh
[root@server0 ~]# /root/2.sh haha xixi hehe lele

###################################################
条件测试

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

常用的测试选项
• 检查文件状态
-e:文档存在为真
-d:文档存在,且必须为目录才为真
-f:文档存在,且必须为文件才为真
[root@server0 ~]# [ -e /etc ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ -e /xixi ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ -d /etc/passwd ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ -f /etc/passwd ]
[root@server0 ~]# echo $?
0
[root@server0 ~]#

• 比较整数大小
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
[root@server0 ~]# [ 1 -eq 2 ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ 1 -eq 1 ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ 10 -gt 9 ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ 9 -ge 9 ]
[root@server0 ~]# echo $?

• 字符串比对
==:一致为真
!=:不一致为真
[root@server0 ~]# [ student == dc ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ student == root ]
[root@server0 ~]# echo $?
1
[root@server0 ~]# [ student != root ]
[root@server0 ~]# echo $?
0
[root@server0 ~]# [ $USER == root ]
[root@server0 ~]# echo $?
0
[root@server0 ~]#
##################################################
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 ~]# /root/if01.sh 1
[root@server0 ~]# /root/if01.sh 2

案例:利用read获取,用户所输入的用户名
进行判断,如果用户名当前系统已存在,则输出 用户已存在
进行判断,如果用户名当前系统不存在,则输出 用户不存在
[root@server0 ~]# vim /root/if02.sh
#!/bin/bash
read -p ‘请输入您要测试的用户名:’ a
id $a &> /dev/null
if [ $? -eq 0 ];then
echo $a用户已存在
else
echo $a用户不存在
fi
[root@server0 ~]#

案例:利用read获取,用户所输入的IP地址
进行判断,如果当前系统可以与该IP地址通信,则输出 可以ping通
进行判断,如果当前系统不可以与该IP地址通信,则输出 不可以ping通
[root@server0 ~]# vim /root/if03.sh
#!/bin/bash
read -p ‘请输入您要测试的IP地址:’ ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo $ip可以通信
else
echo $ip不可以通信
fi

##################################################
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 ‘请输入您的成绩:’ num
if [ $num -ge 90 ];then
echo 优秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo ‘再牛的肖邦,也弹不出哥的悲伤!’
fi

####################################################
列表式循环,反复执行类似的操作

for循环处理
• 遍历/列表式循环
– 根据变量的不同取值,重复执行xx处理

for 变量名  in 值列表
do
   命令序列
done

for 献血车  in  zhangsan  lisi  wangwu
do
    抽血
done

[root@server0 ~]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu natasha harry jack
do
useradd $a &> /dev/null
echo $a创建成功
done
[root@server0 ~]#

列表值可以不参与循环执行的操作

造数工具: {起始…结束}

{1…20}:制造1到20之间连续的数字

[root@server0 ~]# vim /root/for01.sh
#!/bin/bash
for a in {1…20}
do
echo Hello World
done

###################################################
案例4:编写一个判断脚本
在 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 [ $# -eq 0 ];then #判断用户是否输入参数
echo ‘/root/foo.sh redhat|fedora’ >&2 #将正确输出变成错误输出
exit 38 #脚本退出返回值
elif [ $1 == redhat ];then #判断参数是否是redhat
echo fedora
elif [ $1 == fedora ];then #判断参数是否是fedora
echo redhat
else
echo ‘/root/foo.sh redhat|fedora’ >&2 #将正确输出变成错误输出
exit 48 #脚本退出返回值
fi

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~上善若水~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值