⚓⚓⚓| 扬帆!起航!让我们去学习Shell语言 | ⚓⚓⚓

举报
Regan Yue 发表于 2021/07/08 10:26:26 2021/07/08
【摘要】 01 为什么要学习shell编程a linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理b 对于JavaEE和Python程序员来说,工作的需要,你的领导会要求你编写一些shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本c 对于大数据程序员来说,需要编写shell程序来管理集群 02 变量#!/bin/bash#案例1 定义变量AA=1...

01 为什么要学习shell编程

  • a linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理
  • b 对于JavaEE和Python程序员来说,工作的需要,你的领导会要求你编写一些shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本
  • c 对于大数据程序员来说,需要编写shell程序来管理集群

02 变量

#!/bin/bash
#案例1 定义变量A
A=100
#输出变量需要加上$
echo A=$A
echo "A=$A"
#案例2 撤销变量A
unset A
echo "A=$A"

a A=`date` 反引号,运行里面的命令,并把结果返回给变量A
b A=$(date)等价于反引号

#p.s. 等号的两边不能有空格
定义变量的规则:
1 变量名称可以由字母、数字、下划线组成,但是不能以数字开头。
5A=500是错误的

2 等号的两边不能有空格 (注意:这点不同于java中声明变量的语法)

3 变量名称一般为大写

03 位置参数变量

#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数是$#"

04 运算符

#!/bin/bash
#案例1:计算(2+3X 4 的值
# 使用第一种方式:
RES1=$(((2+3)*4))
echo "res1=$RES1"
# 使用第二种方式
RES2=$[(2+3)*4]
echo "res2=$RES2"
# 第三种方式
RES3=`expr 2 + 3 `
echo "RES3=$RES3"
echo "res4=`expr $RES3 \* 4`"

#案例2:请求出命令行的两个参数【整数】的和20 50
SUM=$[$1+$2] 其中$1表示第一个参数的值 20 $2表示第二个参数的值 50
echo $SUM

05 流程控制

#!/bin/bash
# “man” 是否等于"man"
#判断语句使用=
if [ "man" = "man" ]
then
echo "equal"
if [ 23 ‐ge 22 ]
then
echo "大于"
else
echo "小于"
fi
# /root/shcode/aaa.txt 目录中的文件是否存在
#判断语句:使用 ‐f
if [ ‐f /root/shcode/aaa.txt ]
then
echo "存在"
else
echo "不存在"
fi

流程控制语句

case 语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

06 流程控制之for循环

#基本语法1for 变量 in123...
do
echo "周一"
;;
"2")
echo "周二"
;;
"3")
echo "周三"
;;
"4")
echo "周四"
;;
"5")
echo "周五"
;;
"6")
echo "周六"
;;
"7")
echo "周日"
;;
*)
echo "您输入的有误"
;;
esac程序/代码
done

#基本语法2:

for((初始值;循环控制条件;变量变化))
do
程序
done
#!/bin/bash
# 案例1 打印命令行输入的参数 【这里可以看出$* 和 $@的区别】
#$*是把输入的参数当做一个整体
for i in "$*"
do
echo "num is $i"
done
#使用$@来获取输入的参数,注意,这时是分别对待,所以有几个参数就输出几句
echo "======================================"
for j in "$@"
do
echo "num is $j"
done

07 流程控制之while循环

while循环

基本语法
while [ 条件表达式 ]
do
程序
done
注意:while[ 之间有空格,条件判断式和[ 之间也有空格

#!/bin/bash
#案例1:从命令行输入一个数n,统计1+2+....+n的值是多少
SUM=0
i=0
while [ $i ‐le $1 ]
do
SUM=$[ $SUM+$i ] 或者写成 SUM=$(( $SUM+$i ))
#i自增
i=$[ $i+1 ] 或者写成 i=$(( $i+1 ))
done
echo "执行结果是=$SUM"

08 read读取控制台输入

#!/bin/bash
#案例1读取控制台输入的一个num1的值
read ‐p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
#案例2读取控制台输入的一个num2的值 在10秒内输入
read ‐t 10 ‐p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

09 函数

#!/bin/bash
#计算输入两个参数的和,(动态的获取)getSum
# 定义函数 getSum
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
#输入两个值
read ‐p "请输入一个数n1=" n1
read ‐p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2

09 随机数

echo $[$RANDOM%3]
#产生0-3 之间的随机数
echo $[$RANDOM%4]
#产生1-50之间的随机数 $[$RANDOM%50+1]
#注意 $RANDOM%50 产生的数字是0-49
#产生10-99之间的随机数 $[$RANDOM%89+10]

下面来通过几道题训练一下。

练习题

第一题

编写一个shell脚本完成以下功能

1 显示文字 “你好,ReagnYue”

2 定义一个变量STR,初始值是"hello" ,使该变量输出重定向
到/home/str.txt

3 获取用户输入的参数n 计算1+2+3+…+n的和

#!/bin/bash

echo "你好,ReganYue"
STR="hello"
echo STR >> /home/str.txt
sum=0
for i in $(seq $1)
do
sum=$((sum+i))
done
echo sum=$sum

第二题

编写一个shell脚本完成以下功能

1 在终端输入一个1-100之间的成绩,若成绩大于等于90且小于100,
显示"优秀",若成绩大于等于70且小于90,显示"良好",若成绩大于等
于60且小于70,显示及格,若成绩大于等于0且小于60,显示"不及
格",输入其他数值,显示"输入有误"。

2 传递一个参数给脚本,如果参数为exit,显示"退出程序", 如果参数是
yes,则显示"继续",输入其他参数,则显示"无法识别"

#!/bin/bash

read -p "请输入成绩:" score
if [ $score -ge 90 -a $score -lt 100 ]
then
echo "优秀"
elif [ $score -ge 70 -a $score -lt 90 ]
then
echo "良好"
elif [ $score -ge 60 -a $score -lt 70 ]
then
echo "及格"
elif [ $score -ge 0 -a $score -lt 60 ]
then
echo "不及格"
else
echo "输入有误"
fi

if [ $1 = "exit" ]
then
echo "退出程序"
elif [ $1 = "yes" ]
then
echo "继续"
else
echo "输入有误"
fi

image.png

第三题

编写一个shell脚本完成以下功能

1 获取用户输入的两个数,显示两个数中的较大数

2 添加一个新组为class01,然后,添加属于这个组的30个用户,用户名
的形式为stdXX,其中,XX从 01到 30

#!/bin/bash

read -p "请输入两个数:" a b

if [ $a -gt $b ]
then
echo "$a"
fi

if [ $b -gt $a ]
then
echo "$b"
fi

group="class01"
groupadd $group
i=1
while [ $i -le 30 ]
do
if [ $i -le 9 ]
then
username=user0$i
else
username=user$i
fi
useradd $username
mkdir /home/$username
chown -R $username /home/$username
chgrp -R $group /home/$username
usermod -g $group $username
i=$(($i+1))
done

第四题

编写一个shell脚本完成以下功能

1 在root目录下创建一个文件夹code,在code文件夹下创建一个
phonenum.txt文件,写一个脚本,随机产生以158开头的手机号1000
个,添加到phonenum.txt文件中,每个一行

2 在上面的1000个手机号中抽取5个幸运观众,显示出这5个幸运观
众,显示手机号的要求是只显示头3个数字和末4个数字 中间的都用
替 例如 158
***4589

#!/bin/bash
cd /root
mkdir code
touch phonenum.txt

for i in {1..1000};
do
a1=$(($RANDOM%10))
a2=$(($RANDOM%10))
a3=$(($RANDOM%10))
a4=$(($RANDOM%10))
a5=$(($RANDOM%10))
a6=$(($RANDOM%10))
a7=$(($RANDOM%10))
a8=$(($RANDOM%10))
echo "158$a1$a2$a3$a4$a5$a6$a7$a8" >>  /root/code/phonenum.txt
done

image.png

第五题

编写一个shell脚本完成以下功能

在/userdata目录下建立50个目录,即user1~user50,并设置每个目
录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、
写、执行;文件所有者所在组的权限为:读、执行。

#!/bin/bash

for i in {1..50};
do
mkdir "user$i"
chmod 754 "user$i"
done

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。