Linux就该这么学--条件语句

for条件循环语句

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过,执行批量创建用户的Shell脚本Example.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。由于已经将多余的信息通过输出重定向符转移到了/dev/null黑洞文件中

[root@myserver ~]# cat users.txt 
ndy
barry
carl
duke
eric
george
[root@myserver ~]# cat Example.sh 
#!/bin/bash
 read -p "Enter The Users Password : " PASSWD
 for UNAME in `cat users.txt`
 do
	 if [ $? -eq 0 ]
	 then
		 echo "Already exists"
	 else
		 useradd $UNAME &> /dev/null
		 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
		 if [ $? -eq 0 ]
		 then
			 echo "$UNAME , Create success"
		 else
			 echo "$UNAME , Create failure"
		 fi
	 fi
 done
[root@myserver ~]# 

 在Linux系统中,/etc/passwd是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息

[root@myserver ~]# sh Example.sh 
Enter The Users Password : linuxprobe
ndy , Create success
barry , Create success
carl , Create success
duke , Create success
eric , Create success
george , Create success
[root@myserver ~]# 

练习:倒数5秒

[root@myserver ~]# cat example1.sh 
#!/bin/bash
echo "准备倒数5秒:"
for i in $(seq 5 -1 1)
do
	  echo -en "$i";sleep 1
  done
  echo -e "开始"
[root@myserver ~]# sh example1.sh 
准备倒数5秒:
54321开始
[root@myserver ~]# 

while条件循环语句

while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于for循环语句中有目标、有范围的使用场景。while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。while语句的语法格式如图4-21所示。第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

图4-21  while循环语句的语法格式

接下来结合使用多分支的if条件测试语句与while条件循环语句,编写一个用来猜测数值大小的脚本Guess.sh。该脚本使用$RANDOM变量来调取出一个随机的数值(范围为0~32767),将这个随机数对1000进行取余操作,并使用expr命令取得其结果,再用这个数值与用户通过read命令输入的数值进行比较判断。这个判断语句分为三种情况,分别是判断用户输入的数值是等于、大于还是小于使用expr命令取得的数值。当前,现在这些内容不是重点,我们当前要关注的是while条件循环语句中的条件测试始终为true,因此判断语句会无限执行下去,直到用户输入的数值等于expr命令取得的数值后,这两者相等之后才运行exit 0命令,终止脚本的执行

[root@myserver ~]# vim Guess.sh

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
        read -p "请输入您猜测的价格数目:" INT
        let TIMES++
        if [ $INT -eq $PRICE ] ; then
                echo "恭喜您答对了,实际价格是 $PRICE"
                echo "您总共猜测了 $TIMES 次"
                exit 0
        elif [ $INT -gt $PRICE ] ; then
                echo "太高了!"
        else
                echo "太低了!"
        fi
done

[root@myserver ~]# sh Guess.sh 
商品实际价格为0-999之间,猜猜看是多少?
请输入您猜测的价格数目:600
太高了!
请输入您猜测的价格数目:500
太高了!
请输入您猜测的价格数目:300
太低了!
请输入您猜测的价格数目:450
太低了!
请输入您猜测的价格数目:480
太高了!
请输入您猜测的价格数目:470
太高了!
请输入您猜测的价格数目:460
太高了!
请输入您猜测的价格数目:455    
太低了!
请输入您猜测的价格数目:456
恭喜您答对了,实际价格是 456
您总共猜测了 9 次
[root@myserver ~]# 

shell 利用while循环打印出三角形

[root@myserver ~]# cat example2.sh
#!/bin/sh
i=1
while [ $i -le 10 ] ; do
	j=1
	while [ $j -le $((10-$i)) ] ; do
		echo -n ' '
		j=$(($j+1))
	done

	j=1
	while [ $j -le $((2*$i-1)) ] ; do
		echo -n x
		j=$(($j+1))
	done
	echo
	i=$(($i+1))
done
exit 0
[root@myserver ~]# sh !$
sh example2.sh
         x
        xxx
       xxxxx
      xxxxxxx
     xxxxxxxxx
    xxxxxxxxxxx
   xxxxxxxxxxxxx
  xxxxxxxxxxxxxxx
 xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
[root@myserver ~]# 

case条件测试语句

如果您之前学习过C语言,看到这一小节的标题肯定会会心一笑“这不就是switch语句嘛!”是的,case条件测试语句和switch语句的功能非常相似!case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。case语句的语法结构如图4-22所示。

第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

图4-22  case条件测试语句的语法结构

在前文介绍的Guess.sh脚本中有一个致命的弱点—只能接受数字!您可以尝试输入一个字母,会发现脚本立即就崩溃了。原因是字母无法与数字进行大小比较,例如,“a是否大于等于3”这样的命题是完全错误的。我们必须有一定的措施来判断用户的输入内容,当用户输入的内容不是数字时,脚本能予以提示,从而免于崩溃。

通过在脚本中组合使用case条件测试语句和通配符(详见第3章),完全可以满足这里的需求。接下来我们编写脚本Checkkeys.sh,提示用户输入一个字符并将其赋值给变量KEY,然后根据变量KEY的值向用户显示其值是字母、数字还是其他字符。

[root@myserver ~]# cat Checkkeys.sh 
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
	[a-z]|[A-Z])
		echo "您输入的是 字母。"
		;;
	[0-9])
		echo "您输入的是 数字。"
		;;
	*)
		echo "您输入的是 空格、功能键或其他控制字符。"
esac
[root@myserver ~]# sh Checkkeys.sh 
请输入一个字符,并按Enter键确认:3
您输入的是 数字。

练习

[root@myserver ~]# cat  example3.sh
#!/bin/bash
printf "Input integer number: "
read num
case $num in
    1)
        echo "Monday"
        ;;
    2)
        echo "Tuesday"
        ;;
    3)
        echo "Wednesday"
        ;;
    4)
        echo "Thursday"
        ;;
    5)
        echo "Friday"
        ;;
    6)
        echo "Saturday"
        ;;
    7)
        echo "Sunday"
        ;;
    *)
        echo "error"
esac
[root@myserver ~]# sh !$
sh example3.sh
Input integer number: 5
Friday

计划任务服务程序

经验丰富的系统运维工程师可以使得Linux在无需人为介入的情况下,在指定的时间段自动启用或停止某些服务或命令,从而实现运维的自动化。尽管我们现在已经有了功能彪悍的脚本程序来执行一些批处理工作,但是,如果仍然需要在每天凌晨两点敲击键盘回车键来执行这个脚本程序,这简直太痛苦了(当然,也可以训练您的小猫在半夜按下回车键)。接下来,刘遄老师将向大家讲解如何设置服务器的计划任务服务,把周期性、规律性的工作交给系统自动完成。

一次性计划任务只执行一次,一般用于满足临时的工作需求。我们可以用at命令实现这种功能,只需要写成“at 时间”的形式就可以。如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号”。在使用at命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系统设置为在今晚23:30分自动重启网站服务

[root@linuxprobe ~]# at 23:30
at > systemctl restart httpd
at > 此处请同时按下Ctrl+d来结束编写计划任务
job 3 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2016 a root

在正式部署计划任务前,请先跟刘遄老师念一下口诀“分、时、日、月、星期 命令”。这是使用crond服务设置任务的参数格式(其格式见表4-6)。需要注意的是,如果有些字段没有设置,则需要使用星号(*)占位,如图4-23所示。第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

图4-23  使用crond设置任务的参数格式

也可以参考网址调整自己的定时任务 https://tool.lu/crontab/

假设在每周一、三、五的凌晨3点25分,都需要使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。我们可以使用crontab -e命令来创建计划任务。为自己创建计划任务无需使用-u参数,具体的实现效果的参数如crontab -l命令结果所示:

[root@myserver ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
[root@myserver ~]# crontab -e

25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

用户身份与能力

管理员UID为0:系统的管理员用户。

系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。普通用户UID从1000开始:是由管理员创建的用于日常工作的用户

 useradd命令

useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。

可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组

-c<备注>  加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录>  指定用户登入时的起始目录。
-D  变更预设值.
-e<有效期限>  指定帐号的有效期限。
-f<缓冲天数>  指定在密码过期后多少天即关闭该帐号。
-g<群组>  指定用户所属的群组。
-G<群组>  指定用户所属的附加群组。
-m  自动建立用户的登入目录。
-M  不要自动建立用户的登入目录。
-n  取消建立以用户名称为名的群组.
-r  建立系统帐号。
-s<shell>   指定用户登入后所使用的shell。
-u<uid>  指定用户ID。

添加一般用户

[root@myserver ~]# id yhd
uid=1007(yhd) gid=1007(yhd) groups=1007(yhd)

添加一个系统用户

[root@myserver ~]# useradd -r yang
[root@myserver ~]# id yang
uid=976(yang) gid=974(yang) groups=974(yang)
[root@myserver ~]# 

为新添加的用户指定home目录

[root@myserver ~]# useradd -d /home/gaga xiaxia
[root@myserver ~]# tree /home
/home
├── barry
├── carl
├── duke
├── eric
├── gaga
├── george
├── linuxprobe
│   ├── Desktop
│   ├── Documents
│   ├── Downloads
│   ├── Music
│   ├── Pictures
│   ├── Public
│   ├── Templates
│   └── Videos
├── ndy
└── yhd

17 directories, 0 files
[root@myserver ~]# 

 建立用户且制定ID

[root@myserver ~]# useradd caocao -u 544
[root@myserver ~]# id caocao
uid=544(caocao) gid=1011(caocao) groups=1011(caocao)
[root@myserver ~]# 

下面我们创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器。在下面的命令中,请注意/sbin/nologin,它是终端解释器中的一员,与Bash解释器有着天壤之别。一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中: 

[root@myserver ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin laoliu
[root@myserver ~]# id laoliu
uid=8888(laoliu) gid=8888(laoliu) groups=8888(laoliu)
[root@myserver ~]# 

 groupadd命令

groupadd命令用于创建用户组,格式为“groupadd [选项] 群组名”。

为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。创建用户组的步骤非常简单

-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组ID小于 500;
-K:覆盖配置文件 "/ect/login.defs";
-o:允许添加组 ID 号不唯一的工作组。
-f,--force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。

 usermod命令

usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。

-c<备注>  修改用户帐号的备注文字。
-d登入目录>  修改用户登入时的目录。
-e<有效期限>  修改帐号的有效期限。
-f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。
-g<群组>  修改用户所属的群组。
-G<群组>  修改用户所属的附加群组。
-l<帐号名称>  修改用户帐号名称。
-L  锁定用户密码,使密码无效。
-s<shell>  修改用户登入后所使用的shell。
-u<uid>  修改用户ID。
-U  解除密码锁定。

  passwd命令

passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”

-l	锁定用户,禁止其登录
-u	解除锁定,允许用户登录
--stdin	允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username
-d	使该用户可用空密码登录系统
-e	强制用户在下次登录时修改密码
-S	显示用户的密码是否被锁定,以及密码所采用的加密算法名称

修改普通用户密码和root密码

[root@myserver ~]# passwd yhd
Changing password for user yhd.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@myserver ~]# passwd
Changing password for user root.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@myserver ~]# 

passwd命令禁止该用户登录系统(锁用户--->查看用户状态-->解锁用户--->查看用户状态)

[root@myserver ~]# passwd -l yhd
Locking password for user yhd.
passwd: Success
[root@myserver ~]# passwd -S yhd
yhd LK 2021-01-15 0 99999 7 -1 (Password locked.)
[root@myserver ~]# passwd -u yhd
Unlocking password for user yhd.
passwd: Success
[root@myserver ~]# passwd -S yhd
yhd PS 2021-01-15 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@myserver ~]# 

 userdel命令

userdel命令用于删除用户,格式为“userdel [选项] 用户名”

-f	强制删除用户
-r	同时删除用户及用户家目录
[root@myserver ~]# tail -f /etc/passwd
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash
yhd:x:1007:1007::/home/yhd:/bin/bash
yang:x:976:974::/home/yang:/bin/bash
gaga:x:1008:1008::/yang/hua:/bin/bash
pipi:x:1009:1009::/yang/gaga:/bin/bash
xiaxia:x:1010:1010::/home/gaga:/bin/bash
caocao:x:544:1011::/home/caocao:/bin/bash
laoliu:x:8888:8888::/home/linux:/sbin/nologin
^C
[root@myserver ~]# userdel -r pipi
[root@myserver ~]# tail -f /etc/passwd
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash
yhd:x:1007:1007::/home/yhd:/bin/bash
yang:x:976:974::/home/yang:/bin/bash
gaga:x:1008:1008::/yang/hua:/bin/bash
xiaxia:x:1010:1010::/home/gaga:/bin/bash
caocao:x:544:1011::/home/caocao:/bin/bash
laoliu:x:8888:8888::/home/linux:/sbin/nologin
^C
[root@myserver ~]# 

猜你喜欢

转载自blog.csdn.net/yanghuadong_1992/article/details/112689481