写点什么

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

用户头像
Regan Yue
关注
发布于: 刚刚

01 为什么要学习 shell 编程

  • a linux 运维工程师在进行服务器集群管理时,需要编写 shell 程序来进行服务器管理

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

  • c 对于大数据程序员来说,需要编写 shell 程序来管理集群

02 变量

#!/bin/bash#案例1 定义变量AA=100#输出变量需要加上$echo A=$Aecho "A=$A"#案例2 撤销变量Aunset Aecho "A=$A"
a A=`date` 反引号,运行里面的命令,并把结果返回给变量Ab A=$(date)等价于反引号
#p.s. 等号的两边不能有空格定义变量的规则:1 变量名称可以由字母、数字、下划线组成,但是不能以数字开头。5A=500是错误的
2 等号的两边不能有空格 (注意:这点不同于java中声明变量的语法)
3 变量名称一般为大写
复制代码

03 位置参数变量

#!/bin/bashecho "0=$0 1=$1 2=$2"echo "所有的参数=$*"echo "$@"echo "参数的个数是$#"
复制代码

04 运算符

#!/bin/bash#案例1:计算(2+3)X 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 50SUM=$[$1+$2] 其中$1表示第一个参数的值 20 $2表示第二个参数的值 50echo $SUM
复制代码

05 流程控制

#!/bin/bash# “man” 是否等于"man"#判断语句使用=if [ "man" = "man" ]thenecho "equal"if [ 23 ‐ge 22 ]thenecho "大于"elseecho "小于"fi
复制代码


# /root/shcode/aaa.txt 目录中的文件是否存在#判断语句:使用 ‐fif [ ‐f /root/shcode/aaa.txt ]thenecho "存在"elseecho "不存在"fi
复制代码

流程控制语句

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

06 流程控制之 for 循环

#基本语法1:
for 变量 in 值1 值2 值3...doecho "周一";;"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 "$*"doecho "num is $i"done#使用$@来获取输入的参数,注意,这时是分别对待,所以有几个参数就输出几句echo "======================================"for j in "$@"doecho "num is $j"done
复制代码

07 流程控制之 while 循环

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


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

08 read 读取控制台输入

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

09 函数

#!/bin/bash#计算输入两个参数的和,(动态的获取)getSum# 定义函数 getSumfunction getSum() {SUM=$[$n1+$n2]echo "和是=$SUM"}#输入两个值read ‐p "请输入一个数n1=" n1read ‐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.txtsum=0for i in $(seq $1)dosum=$((sum+i))doneecho sum=$sum
复制代码

第二题

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


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


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


#!/bin/bash
read -p "请输入成绩:" scoreif [ $score -ge 90 -a $score -lt 100 ]thenecho "优秀"elif [ $score -ge 70 -a $score -lt 90 ]thenecho "良好"elif [ $score -ge 60 -a $score -lt 70 ]thenecho "及格"elif [ $score -ge 0 -a $score -lt 60 ]thenecho "不及格"elseecho "输入有误"fi
if [ $1 = "exit" ]thenecho "退出程序"elif [ $1 = "yes" ]thenecho "继续"elseecho "输入有误"fi
复制代码



第三题

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


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


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


#!/bin/bash
read -p "请输入两个数:" a b
if [ $a -gt $b ]thenecho "$a"fi
if [ $b -gt $a ]thenecho "$b"fi
group="class01"groupadd $groupi=1while [ $i -le 30 ]doif [ $i -le 9 ]thenusername=user0$ielseusername=user$ifiuseradd $usernamemkdir /home/$usernamechown -R $username /home/$usernamechgrp -R $group /home/$usernameusermod -g $group $usernamei=$(($i+1))done
复制代码

第四题

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


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


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


#!/bin/bashcd /rootmkdir codetouch phonenum.txt
for i in {1..1000};doa1=$(($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.txtdone
复制代码



第五题

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


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


#!/bin/bash
for i in {1..50};domkdir "user$i"chmod 754 "user$i"done
复制代码



发布于: 刚刚阅读数: 2
用户头像

Regan Yue

关注

还未添加个人签名 2020.08.12 加入

对Go、Python、网络安全、区块链感兴趣. · 华为云云享专家 · 掘金资讯创作者

评论

发布
暂无评论
⚓⚓⚓| 扬帆!起航!让我们去学习Shell语言 | ⚓⚓⚓