shell脚本基础

本文介绍了Shell脚本的基础知识,包括脚本的创建、运行,规范的脚本组成,如环境声明、注释和可执行代码。通过示例展示了如何输出系统信息、使用重定向输出,以及创建用户和设置密码的脚本。此外,还讨论了变量的使用、交互式传递参数、环境和位置变量、预定义变量、条件测试和选择结构,以及循环操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

创建用户dc = useradd dc

绿色:可执行程序
案例1:编写hello.sh脚本
[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 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /opt/1.txt /a

[root@server0 ~]# cat /opt/1.txt /a > /opt/2.txt
[root@server0 ~]# cat /opt/2.txt

[root@server0 ~]# cat /opt/1.txt /a 2> /opt/2.txt
[root@server0 ~]# cat /opt/2.txt
[root@server0 ~]# cat /opt/1.txt /a &> /opt/2.txt
[root@server0 ~]# cat /opt/2.txt
###############################################

单引号 ' ' : 取消所有特殊字符的意义,原样输出

[root@server0 ~]# echo ‘* | & ^ % ***’
[root@server0 ~]# echo ‘, !’

反撇号 ` `或$( ) :将命令的输出,直接参与下一次命令的运行

[root@server0 ~]# date +%F
2019-07-06
[root@server0 ~]# cd /opt/
[root@server0 opt]# mkdir nsd-date +%F
[root@server0 opt]# mkdir abc-$(date +%F)
[root@server0 opt]# mkdir (hostname)−(hostname)-(hostname)(date +%F)
##############################################
案例:创建用户并且设置密码的脚本
黑洞设备:/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=tc
useradd KaTeX parse error: Expected 'EOF', got '&' at position 4: a &̲> /dev/null ec…a创建成功
echo 123 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 4: a &̲> /dev/null ec…a密码设置成功

交互式在命令行传递参数给脚本的代码

read -p ‘屏幕提示信息’
1.直接产生交互
2.记录用户在键盘上所有输入
3.将记录的内容交由变量储存
[root@server0 /]# vim /root/user.sh
#!/bin/bash
read -p ‘请输入您要创建的用户名:’ a
useradd KaTeX parse error: Expected 'EOF', got '&' at position 4: a &̲> /dev/null ec…a创建成功
echo 123 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 3: a &̲> /dev/null ec…a密码设置成功
#################################################
vim错误解决:产生交换文件(缓存文件)

]# vim /opt/4.txt

]# rm -rf /opt/.4.txt.swp #删除交换文件

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

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

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

################################################
环境变量 :变量名大写 由系统定义并且赋值完成

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 - dc
[dc@server0 ~]$ echo USERdc[dc@server0 ]USER dc [dc@server0 ~]USERdc[dc@server0 ] exit
logout
[root@server0 ~]#
###############################################
位置变量:由系统定义并且赋值完成

非交互式 在命令行传递参数给脚本的代码

[root@server0 ~]# vim /root/1.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@server0 ~]# /root/1.sh haha tom dcc

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

[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 ~]# vim /root/1.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $#

[root@server0 ~]# /root/1.sh haha xixi hehe lele

$? 程序退出后的状态值,0表示正常,其他值异常

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

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

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

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

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

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

#################################################
[root@server0 ~]# vim /root/if04.sh
#!/bin/bash
read -p ‘请输入您要测试的IP地址:’ ip
ping -c 2 $ip &> /dev/null #-c指定ping的次数
if [ $? -eq 0 ];then
echo $ip可以通信
else
echo $ip不可以通信
fi

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

##############################################
if多分支处理

if [条件测试1];then
   命令序列xx
elif [条件测试2];then
   命令序列yy
else
   命令序列zz
fi

案例:利用read获取用户的成绩
如果大于等于90,则输出 优秀
如果大于等于80,则输出 良好
如果大于等于70,则输出 一般
如果大于等于60,则输出 合格
以上均不满足,则输出 再牛的肖邦也弹不出哥的悲伤
[root@server0 ~]# vim /root/if05.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  献血车   in  献血的队伍
do
    抽血
done

[root@server0 ~]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu haha xixi
do
echo $a
done

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

#######################################
列表值可以不参与,循环代码的执行
[root@server0 ~]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu haha xixi
do
echo I Love DC
done

造数工具:制造连续范围的数字 {起始值…结束值}
[root@server0 ~]# vim /root/for01.sh
#!/bin/bash
for a in {1…99}
do
sleep 0.5 #暂停0.5秒
echo I Love DC $a
done

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董筱杰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值