LINUX-Part5-变量、运算符与语句结构(选择与循环)
1.变量
1.1 shell的变量
(1)系统变量
当前登录用户的家目录路径HOME:当前登录用户的"家目录"路径USER:当前用户名
$RANDOM 可以随机生成 0~32767之间的整数数字
(2)自定义变量
变量名=值;
xm="你好"
echo "姓名:$xm"
echo '姓名:$xm'
readonly p=3.14
n=`cat /etc/passwd | grep -c "root"`
echo $n
(3)特殊变量
- $n n为number,$0代表该脚本名称,$1-$9代表第一到第九个参数
- $# 获取所有输入参数的个数,常用于循环;
- $@ 代表命令行中所有的参数,$@会把每个参数区分对待;
- $? 返回最后一次命令执行的状态,返回0代表正确执行,返回非0代表执行不正确。
(4)read 读取终端输入
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
read -p "请输入密码:" s
read -p "请输入密码:" -t 10 mima
2. 运算符
2.1 普通运算符
(1)赋值运算符 =
(2)算数运算符 + - * / %
(3)逻辑运算符 -a -o ! (与、或、非)
2.2比较运算符
(1)字符串比较: == !=
(2)数值比较:-eq 等于 -ne 不等于 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于
(3)类型权限:-f 存在且是文件 -d 存在且是目录-r 读 (read) -w 写(write) -x 执行 (execute)
3. 选择结构
3.1 if 选择结构 ---then 独立一行
if [ 条件判断 ] then 程序 elif [ 条件判断 ] then 程序 else 程序 fi
read -p "输入一个数字:" n
if [ $n -eq 666 ]
then
echo "evil"
elif [ $n -eq 777 ]
then
echo "lucky"
else
echo "human"
fi
3.2 case语句 等值判断
case $变量名 in
"value 1")
如果变量的值等于value 1,则执行程序1
;;
"value 2")
如果变量的值等于value 2,则执行程序2
;; …省略其他分支…
*)
如果变量的值都不是以上的值,则执行此处程序
;;
esac
read -p "输入一个数字:" n
case $n in
"666")
echo "evil"
;;
"777")
echo "lucky"
;;
*)
echo "human"
;;
esac
3.3练习小测
1.输入两个数字判断两个数字的大小
echo "输入两个数字判断两个数字的大小"
read -p "输入数字n1: " n1
read -p "输入数字n2: " n2
if [ $n1 -lt $n2 ]
then
echo "n1<n2"
elif [ $n1 -gt $n2 ]
then
echo "n1>n2"
else
echo "n1=n2"
fi
2.输入一个数字输出这个数字是偶数还是奇数
echo "输入一个数字输出这个数字是偶数还是奇数小"
read -p "输入数字n: " n
if [ $(($n%2)) -eq 0 ]
then
echo "$n 是偶数"
else
echo "$n 是奇数"
fi
3.判断一个年份是否是闰年,400整除是世纪闰年,100不整除并且被4整除是闰年,其 余是平年
echo "输入一个数字判断一个年份是否是闰年"
read -p "输入数字n: " n
if [ $(($n%400)) -eq 0 ]
then
echo "$n 是世纪闰年"
elif [ $(($n%4)) -eq 0 -a $(($n%100)) -ne 0 ]
then
echo "$n 是闰年"
else
echo "$n 是平年"
fi
4.输入三个数,不考虑相等,有小到大打印输出
echo "输入三个数,不考虑相等,有小到大打印输出"
read -p "输入数字n1: " n1
read -p "输入数字n2: " n2
read -p "输入数字n3: " n3
if [ $n1 -lt $n2 -a $n2 -lt $n3 ]
then
echo "$n1 $n2 $n3"
elif [ $n1 -lt $n3 -a $n3 -lt $n2 ]
then
echo "$n1 $n3 $n2"
elif [ $n2 -lt $n1 -a $n1 -lt $n3 ]
then
echo "$n2 $n1 $n3"
elif [ $n2 -lt $n3 -a $n3 -lt $n1 ]
then
echo "$n2 $n3 $n1"
elif [ $n3 -lt $n1 -a $n1 -lt $n2 ]
then
echo "$n3 $n1 $n2"
elif [ $n3 -lt $n2 -a $n2 -lt $n1 ]
then
echo "$n3 $n2 $n1"
fi
5.编写脚本,将系统日志文件(/var/log/messages),拷贝到/root/文件夹中
`cp /var/log/messages /root/`
6.编写脚本,位置参数传入学生的姓名和班级,打印“我的名字叫xx,我的班级是xx班”
echo "我的名字叫$1,我的班级是$2班."
7.用if,写一个shell脚本,运行时输入一个数字,如果是666则输出 evil,如果是777则 输出lucky, 如果是其他则输出human。
read -p "输入一个数字:" n
if [ $n -eq 666 ]
then
echo "evil"
elif [ $n -eq 777 ]
then
echo "lucky"
else
echo "human"
fi
8.用case方法改写上面的功能。
read -p "输入一个数字:" n
case $n in
"666")
echo "evil"
;;
"777")
echo "lucky"
;;
*)
echo "human"
;;
esac
9.判断/root/hosts是否是存在并且是普通文件,如果不存在则新建一个,如果已经存在,则追加写入当前时间到此文件中
if [ -f /root/hosts/t.txt ]
then
'date >> /root/hosts/t.txt'
else
echo "2"
touch /root/hosts/t.txt
fi
10.判断当前用户是否为root,如果不是则打印非root账号,是的话就执行ifconfig查看 网卡信息($USER获取当前用户)
if [ $USER == "root" ]
then
ifconfig
else
echo "非root账号"
fi
11.位置参数传递一个绝对路径的文件,添加所有人可执行权限且提示添加执行权限成功,如果没有传递参数提示没有传递文件。
if [ $# -eq 1 ]
then
chmod a+x $1
echo "添加执行权限成功"
else
echo "没有传递参数提示没有传递文件"
fi
12.编写脚本判断mysql是否正常启动(端口号3306,查看端口netstat -nltp,然后grep过 滤返回行数,判断行数是否大于0)
if [ `netstat -nltp | grep -c "3306"` -gt 0 ]
then
echo "正常启动"
else
echo "未启动"
fi
13.首先显示当天日期, 然后查找给定的用户是否在系统中工作(cat /etc/passwd)。 如果在系统中,就输出一条欢迎语句(例如 hello,root!);如果不在系统中,就 输出一条语句(waiting for root!)
echo "`date`"
if [ `cat /etc/passwd | grep -c "test"` -eq 1 ]
then
echo "hello,root!"
else
echo "waiting for root!"
fi
14.接受一个参数,若给定参数不是目录, 则给出提示信息;
否则使用 ls -l 命令列出该目录下的内容,并输出有多少个子目录(d 开头),多少 个普通文件(-开头)。
显示示例如下:
目录的数量:16
文件的数量:25
if [ $# -ne 1 ]
then
echo "参数不是目录、参数过多或未输入参数"
elif [ $# -eq 1 -a -d $1 ]
then
ls -l
echo "目录的数量:`ls -l | grep -c "^d"`"
echo "文件的数量:`ls -l | grep -c "^-"`"
fi
4. 循环结构
4.1 for循环
for i in 循环库
do
echo $i ---------循环单元
done
例如
1.写一个循环,输出20-40
for i in {20..40}
do
echo "$i"
done
4.2while
i=1
while [循环条件]
do
echo 循环单元i−−−−−−−−−循环单元i=$((i+1))
done
例如:
# 不确定循环次数
read -p "及格了吗?(y/n):" answer
while [ $answer == "n" ]
do
echo "学习做作业考试" read -p "及格了吗?(y/n):" answer
done
echo "终于及格了"
4.3 练习小测
1.写一个循环,输出20-40
for i in {20..40}
do
echo "$i"
done
2.从1-50的单数,倒序
for i in `seq 51 -2 1`
do
echo "$i"
done
~~~
3.计算并显示 1 到 100 之间的奇数之和
~~~ bash
n=0
for i in `seq 1 2 100`
do
n=$(($n+$i))
done
echo "$n"
5.有若干只鸡兔同在一个笼子里,从上面数有35个头,从下面数有94只脚。问笼中各 有 多少只鸡和兔?
read -p "输入头数:" n1
read -p "输入脚数:" n2
x=$((($n1*4-$n2)/2))
y=$((($n2-$n1*2)/2))
echo "鸡:$x,兔:$y"
6.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一 个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前 一天 剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
for n in {1..20000}
do
m=$n
for i in {1..9}
do
n=$(($n/2-1))
done
if [ $n -eq 1 ]
then
echo "摘了 $m 个,第 $i 天还有剩下 $n 个"
fi
done
7.创建用户组wanmei,批量建立用户wm1到wm9,用户属于wanmei组,创建完成查 看/etc/group 和 /etc/passwd文件
groupadd wanmei
for i in {1..9}
do
useradd -g wanmei wm$i
echo "wm$i 添加完毕"
done
cat /etc/group | grep "wanmei"
cat /etc/passwd | grep "wm*"
8.删除上面的用户和用户组
for i in {1..9}
do
userdel wm$i
echo "wm$i 删除完毕"
done
groupdel wanmei
cat /etc/group | grep "wanmei"
cat /etc/passwd | grep "wm*"
9.实现传入一个目录作为参数,如果传入的不是目录则提示不是目录,如果是目录则 将该目录下所有的普通文件的文件名都罗列出来
read -p "传入一个目录:" n
if [ -d $n ]
then
for i in `ls $n`
do
if [ -f $i ]
then
echo "$i"
fi
done
else
echo "不是目录"
fi
10.猜数字游戏:电脑随机产生一个100以内的数字(1-99),通过每次键盘输入来猜数 字,输入的小了就提示往大猜,输入大了就提示往小里猜, 直到输入正确数字(通 过$RANDOM获取随机数)
n=101
m=$(($RANDOM%100))
while [ $n -ne $m ]
do
read -p "猜数字,请输入数字:" n
if [ $n -lt $m ]
then
echo "往大里猜"
else
echo "往小里猜"
fi
done
echo "恭喜你猜对了"