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+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 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 循环
#基本语法1:
for 变量 in 值1 值2 值3...
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
复制代码
第三题
编写一个 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
复制代码
第五题
编写一个 shell 脚本完成以下功能
在/userdata 目录下建立 50 个目录,即 user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
#!/bin/bash
for i in {1..50};
do
mkdir "user$i"
chmod 754 "user$i"
done
复制代码
评论