Linus-Part5-变量、运算符与语句结构(选择与循环)(学习Linus第5天)

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)特殊变量
  1. $n n为number,$0代表该脚本名称,$1-$9代表第一到第九个参数
  2. $# 获取所有输入参数的个数,常用于循环;
  3. $@ 代表命令行中所有的参数,$@会把每个参数区分对待;
  4. $? 返回最后一次命令执行的状态,返回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 "恭喜你猜对了"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值