shell 基础学习

一:Shell的作用及常见种类:

Shell是一个特殊的应用程序,他介于操作系统内核与用户之间,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行。因此,Shell程序在系统中充当了一个“命令解释器”的角色,eg:微软的cmd.exe也属于Shell程序;

在Unix/Linux操作系统中,能够使用的Shell程序有很多种,功能也比微软的“cmd.exe”要强大的多,下面就是常见到的Shell程序环境,(功能可以自己去了解下:)

Bsh:

Csh:

Ksh:

Bash:

Zsh:

1、Shell环境的切换:

为了提高系统的兼容性,在RHEL5系统中提供了对各种常见Shell程序的支持,通过配置文件“/etc/shells”可以了解系统所支持的shell程序的路径;

查看当前Linux系统中能够使用的Shell程序的列表:

其中有一部分Shell程序实际上是其他Shell程序的符号链接文件,这样做是为了更好地提供Shell程序之间的兼容性,eg:tcsh是csh的兼容升级版本,因此在系统运行csh时将直接运行tcsh。

确认Shell程序中存在的部分链接文件:

用户在执行Linux命令操作的过程中,若希望使用其他的Shell程序环境,可以进行相应的切换。

ksh即可切换到ksh程序环境                               //echo $0

exit即可退回

1.2:更改用户自己的登录Shell

用户每次登录到Linux系统时系统自动加载的Shell程序即为该用户的登录Shell,用户的登录Shell信息记录在“/etc/passwd”文件中,并允许用户通过chsh命令进行修改。

使用chsh命令设置了新的登录Shell后,新的登录Shell将在该用户下一次登录系统时生效

1.3:由管理员(root)更改其他用户的登录Shell

usermod -s /bin/bash teacher 即可!

2、Bash的常用功能:(Tab 键的自动补齐。。。。。。)

2.1:命令历史:history

2.2:命令别名:alias

查看已设置的的所有命令别名:

eg:设置一个命令别名dir,以便执行“ls -ld --color=tty”的命令,并进行确认。

取消上一步设置的dir命令别名:

unalias dir 即可 ///alias -a 取消了所有的命令别名

2.3:标准输入输出和重定向、管道操作等等!

3、Shell变量应用:

在各种Shell程序环境中,都使用到了“Shell变量”的概念,Shell变量用于保存系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化,通过使用变量,Shell程序能够提供更加灵活的功能,适应性更强。

常见的Shell变量的类型包括用户自定义变量,环境变量,预定义编译,位置变量。

3.1:用户自定义变量

用户自定义变量是由系统用户自己定义的变量,只在用户自己的Shell环境中有效,因此又称为本地变量。在编写Shell脚本程序时,通常会需要设置一些特定的自定义变量,以适应程序执行过程中的各种变化,满足不同的需要。

>:定义新的变量,Bash中的变量操作相对比较简单,没有其他高级编程语言(如:C/C++、java等)那么复杂,在定义一个新的变量时,一般不需要提前声明,而是直接指定变量名及初始化值(内容)即可,定义变量操作的基本格式如下(等号两边都没有空格)。

变量名=变量值

1
eg:DAY=Sunday

>:查看及引用变量的值

1
echo $DAY              即可

注:在变量DAY的内容后紧跟“Morning“字符串并一起显示。

1
echo ${DAY}Morning

                   

//错误引用为       echo $DAYMorning          (当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其包围起来,否则将无法确定正确的变量名称)

3.2:为变量赋值的常用方法

在等号“=”后边直接指定变量内容是为变量赋值的最基本方法,除此以外,管理员通常还会使用到其他的一些赋值操作,从而使变量内容获取更加灵活多变,以便适用于各种复杂的系统管理任务。常用的几种变量赋值操作包括双引号、单引号、反撇号、read命令。

>:双引号(“)

使用双引号时,允许在双引号的范围使用”$“符号来引用其他变量的值(变量引用)。在简单的赋值操作中,双引号有时候可以省略。

>:单引号(’)

使用单引号时,将不允许在单引号的范围内引用其他变量的值,”$“符号或者其他任务将作为普通字符看待;

>:反撇号(`)

使用反撇号时,允许将执行特定命令的输出结果赋给变量(命令替换),反撇号内包含的字串必须是能够执行的命令,执行后会用输出结果替换该命令字串。

>:read 命令

除了上述赋值操作以外,还可以使用Bash的内置命令read来给变量赋值。read命令可以从终端(键盘)读取输入,实现简单的交换过程。read将从标准输入读入一行内容,并以空格为分隔符,将读入的各字段分别赋值给指定列表中的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将赋值内容赋值给该变量。


为了使交互式操作的界面更加友好,提高易用性,read命令可以结合“-p”选项来设置提示信息,用于告知用户应该输入的内容等相关事项。

3.3:设置变量的作用范围i对于用户自行定义的变量,默认情况下只能在当前的Shell环境中使用,因此称为局部变量。局部变量在新开启的子Shell环境中是无效的(无法引用定义的变量)

eg:在Bash环境定义的变量是不能在csh使用的。

为了使用户定义的变量在所有的子Shell环境中能够继续使用,减少重复设置工作,可以使用export命令将指定的变量设置为“全局变量”。export命令可以同时使用多个变量名作为参数(不需要使用“$”符号),变量名之前以空格分隔。

export haha   即可!

>:export命令还可以在输出变量的同时对指定名称的变量进程赋值(创建),这样在使用export命令之前就不需要单独为变量进行赋值了

eg:定义两个变量MONTH、YEAR,并将其设置为全局变量。

3.4:清除自定义变量:当用户不再需要使用定义变量时,可以使用unset命令对已定义的用户变量进行清除,指定一个或多个变量名称作为参数即可(以空格分隔)

unset DAY MONTH YEAR         //即可!

3.5:数值变量的运算

Bash程序并不适合进行强大的数学运算(如小数、指数等),一般只适合进行简单的整数运算。可以使用expr 表达式命令,格式如下:

expr 变量1 运算符 变量2                            +              -          \*      /  

4、环境变量

这里说的环境变了是指用户登录后Linux系统预先设定好的一类Shell变量,其功能是设置用户的工作环境,包括用户宿主目录,命令查看路径,用户当前目录,登录终端等,在实际使用过程中,环境变量并没有严格的区分定义,用户自己设置的变量也可以作为环境变量。

环境变量的名称比较固定,通常使用大写字母,数字和其他字符组成,而不使用小写字母。环境变量的值一般由Linux系统自行维护、会随着用户状态的改变而改变,用户可以通过读取环境变量来了解自己当前的环境。

4.1>:查看环境变量;set  即可!

根据当前环境变量用户可以知道好多内容


确认当前的命令搜索路径,并将“/opt/bin”目录添加带现有的搜索路径中去。

4.2>:环境变量配置文件

在Linux系统中,用户环境变量的设置工作习惯上在"/etc/profile"文件及用户宿主目录中的“.bash_profile”文件中进行,前者称为全局配置文件(对所有用户起作用),后者成为用户配置文件(允许覆盖 全局配置)。

5:位置变量

所谓位置变量也就是一些$n变量

$12345689

6:预定义变量

预定义变量是由Bash程序预先定义好的一些特殊变量。用户只能使用预定义变量,而不能创建新的预定义变量,或直接修改预定义变量赋值。所有的预定义变量都是由“$”符号和另一个符号组成的,较常用的Shell预定义变量包括以下这些。

1
2
3
4
5
6
$#:表示命令行中位置参数的数量。
$*:表示所有位置参数的内容。
$?:表示命令执行后返回的状态,用户检查上一个命令的执行是否正确。在Linux中,命令推出状态为 0 表示命令执行正确,任何非 0 值的表示命令执行错误。
$$:表示当前进程的进程号。
$!:表示后台运行的最后一个进程的进程号。
$ 0 :表示当前执行的进程的进程名。

预定义变量通常使用在Shell脚本程序中,在命令行界面中的应用并不多见(尽管也可以使用)。

7:脚本的概念:

Bash程序不仅可以作为用户管理Linux系统的命令操作环境,同时也可以作为一种优秀的脚本程序语言。凡是使用Shell编程的语言编写的程序都可以称为Shell脚本,通俗一点说,只要将一些Linux命令按顺序保存到一个文本文件中,并给予这个文件可执行权限,那么这个文件就可以称为Shell脚本。当然,Shell脚本是为了完成一定的管理任务才创建的,因此脚本文件中的各条命令并不是杂乱无章随便放置的,这就需要用户来进行组织和设计了。

7.1:编写Shell脚本文件 (建立包含可执行语句的文件文件)

使用文本编辑器程序(如:vi)创建脚本文件,文件名中可以使用扩展名(如:“.sh”),也可以不使用扩展名,并没有强制的要求。脚本中可能包括的内容如下:

>:运行环境设置:通常位于文件的第一行,用户指定使用那一个Shell程序进行解释。设置时以“#!”开始,后面紧跟上指定的Shell程序的完成路径,如“#!/bin/bash”。

>:注释行:在脚本文件中,除了以“#!”开头的Shell环境设置行以外,其他以“#”符号开头的内容将被视为注释信息,执行脚本时将予以忽略。编写脚本程序时,添加必要的注释语句是一个良好的习惯,这样将大大增强脚本文件的易读性,方便在不同时间,不同用户间交流使用。

>:可执行语句:可执行语句是Shell脚本程序中最重要的组成部分,在命令行操作界面中可以执行的命令都可以写入到脚本当中,程序运行时默认情况下将会按照顺序依次解释执行。除此以外,还可以添加一些程序结构语句,用户灵活控制执行过程,提高程序执行效率。

eg:使用vi编辑器编写一个简单的Shell脚本文件test.sh,用于报告当前系统中“/boot”目录所占用的空间大小,并列出其中的内核文件的属性信息。

为脚本文件添加可执行权限

chmod a+x test.sh

执行该脚本:bash test.sh

7.2:说到执行Shell脚本有多种方式:

>:直接执行带"x"权限的脚本文件

为脚本文件设置了可执行属性后,在Shell命令行中可以直接通过脚本文件的路径执行脚本程序,这也是最常用的一种方式,

执行时需要在文件名之前加入“./”路径,明确执行需要执行当前目录下的脚本文件,这种方法也是出于对系统安全性的考虑。

>:使用Shell解释器程序执行脚本

这种方式可以将脚本文件作为指定Shell解释器程序(如:bash、sh等)的参数,由解释器程序负责读取脚本文件中的内容并执行,因此并不需要脚本文件具有可执行属性。此方法通常只在脚本的调试阶段使用。

>:使用“.”命令执行脚本

使用Shell解释器程序(如:bash)执行指定脚本文件时,是在当前Shell中启动一个子Shell来运行脚本程序,因此脚本程序中定义的环境变量只能在子Shell环境中使用,而无法在用户当前的Shell环境中使用。

使用Bash的内部命令“.”(或使用source命令,其作用相同)加载指定的脚本文件并执行时,系统将不会开启新的Shell环境。使用这种方式时,脚本文件作为“.”命令的参数,因此同样不要求脚本文件具备“x”权限。例如,在修改完“/etc/profile”文件以后,可以执行“. /etc/profile”命令,使得在文件中新设置的变量立即生效,而无需重新登录。

test.sh脚本在/home/下

实例1:由于公司的文件服务器空间有限,需要完成一向定期任务,即在每周五下班前(17:30)检查公共共享目录"/var/ftp/pub"中的内容,并将其中所有子目录及文件的详细列表和当时的时间信息追加保存到“/var/log/pubdir.log”日志文件中,然后清空目录中的内容。

vim /opt/ftpclean.sh


1
2
3
chmod a+x /opt/ftpclean.sh
crontab -e
30  17  * *  5  /opt/ftpclean.sh

OK!     记得crond服务

实例2:公司内网开发服务器中的数据库目录位于“/usr/local/mysql/lib/mysql”,根据数据安全管理要求,至少每隔三天要做一次完成备份,备份前需要统计该目录占用的总空间大小,并将备份日期、目录空间大小等信息保存到临时文件“/tmp/dbinfo.txt”中,然后使用tar命令将dbinfo.txt文件随数据库目录一起备份到"/opt/dbbak/"目录中,备份包文件名要要求体现当天的日期。

mkdir /opt/dbbak

vim /opt/dbbak.sh

1
2
3
chmod a+x /opt/dbbak.sh
crontab -e
55  23  */ 3  * * /opt/dbbak.sh

记得crond服务



在Shell脚本中执行使用if语句的好处是:可以根据特定的条件(eg:判断备份目录是否存在)来决定是否执行某项操作,当满足不同的条件时执行不同的操作(eg:备份目录不存在则创建该目录,否则跳过操作)。该文将分别从条件测试操作,if语句结构,应用示例这三个方面讲解if语句在Shell脚本中的应用。

1、条件测试操作:

需要在Shell脚本中有选择性地执行任务时,首先面临的问题就是,如何设置命令执行的条件?

在Shell环境中,可以根据命令执行后返回状态值来判断该命令是否成功执行,当返回值为0是表示成功执行,否则(非0值)表示执行失败。用于特定条件表达式的测试时,可以使用Linux系统中提供的专用工具——test命令、

使用test测试命令时,可以有以下两种形式。

test       条件表达式

【 条件表达式 】

这两种方式的作用完全相同,但通常后一种形式更为常用,也更贴近编程习惯。需要注意的是,方括号“[”或者“]”与条件表达式语句之间至少需要有一个空格进行分隔。

根据需要判断的条件内容不同,条件操作也不同,最常用的条件主要包括文件状态测试,比较整数值大小,比较字符串,以及同时判断多个条件时的逻辑关系,下面将分别进行讲解。以下主要采用方括号的测试形式。

1.1、测试文件状态

文件状态测试是指根据给定的路径名称,判断该名称对应的是文件还是目录,或者判断文件是否可读,可写,可执行等。根据判断的状态不同,在条件表达式中需要使用不同的操作选项。

-d:测试是否为目录(Directory)。

-e:测试目录或文件是否存在(Exist)。

-f:测试是否为文件(File)。

-r:测试当前用户是否有权限读取(Read)。

-w:测试当前用户是否有权限写入(Write)。

-x:测试当前用户是否可执行(Excute)该文件。

-L:测试是否为符号连接(Link)文件。

执行条件测试操作以后,通过预定义变量“$?”可以获得测试命令的返回状态值,从而能够判断该条件是否成立(返回0值表示条件成立,非0值表示条件不成立)。但通过这种方式查看测试结果会比较繁琐。

例1:测试“/etc/hosts”是否是文件,并通过“$?”变量查看返回状态值,据此判断测试结果。

1
2
3
[ -f /etc/hosts ]
echo $?
0    //返回值为0,表示上一步测试的条件成立。

例2:测试“/media/cdrom/Server”及其父目录是否存在,如果存在则显示“YES”否则不输出任何信息。

1
2
3
4
[ -e /media/cdrom/Server ] && echo  "YES"
                                                                         // 无输出表示该目录不 存在
[ -e /media/cdrom ] && echo  "YES"
YES

1.2、整数值 比较:

整数值比较是指根据给定的两个整数值,判断第一个数是否大于、等于、小于。。。。。。第2个数,可以使用的操作选项如下:

1
2
3
4
5
6
-eq:第一个数等于(Equal)第二个数。
-ne:第一个数不等于(Not Equal)第二个数。
-gt:第一个数大于(Greater Than)第二个数。
-lt:第一个数小于(Lesser Than)第二个数。
-le:第一个数小于或等于(Lesser or Equal)第二个数。
-ge:第一个数大于或等于(Greater or Equal)第二个数。

整数值比较的测试操作在Shell脚本编写中的应用较多,如:用于判断磁盘使用率、登录用户数量是否超标以及用于控制脚本语句的循环次数等。

例1:测试当前登录到系统中的用户数量是否小于或等于10,是则输出”YES“。

1
2
3
4
who | wc -l
5
[ `who | wc -l` -le  10  ] && echo ”YES"
YES

例2:提取出"/boot“分区的磁盘使用率,并判断是否超过95%(为了便于理解,操作步骤适当进行分解)

1
2
3
4
5
6
df -hT | grep ”/boot“ | awk  '{print $6}'
12 %
BootUsage=`df -hT | grep ”/boot " | awk '{print $6}' | cut -d " %" -f  1 `
echo $BootUsage
12
[ $BootUsage -gt  95  ] && echo  "YES"     //无输出表示未超标

1.3:字符串比较:

字符串比较可以用于检查用户输入,如:在提供交互式操作时,判断用户输入的选项是否与指定的变量内容相匹配。“=”、“!=”操作选项分别表示匹配、不匹配。“-z”操作选项用于检查字符串是否为空。其中,“!”符号用于取反,表示相反的意思。

eg:提示用户输入一个文件路径,并判断是否是“/etc/inittab”,如果是则显示“YES”.

1
2
3
4
read -p  "Location: "  FilePath
Location: /etc/inittab           
[ $FilePath =  "/etc/inittab"  ] && echo  "YES"
YES

eg: 若当前环境变量LANG的内容不是“en.US”,则输出LANG变量的值,否则无输出。

1
2
[ $LANG !=  "en.US"  ] && echo $LANG
zh_CN.UTF- 8

eg: 使用touch命令建立一个新文件,测试其内容是否为空,向文件中写入内容后,再次进行测试。

1
2
3
4
5
6
touch zero.file
[ -z `cat zero.file` ] && echo  "yes"
yes
echo  "something"  > zero.file
[ -z `cat zero.file` ] && echo yes
                                                    //无输出

1.4:逻辑测试:

逻辑测试是指同时使用的两个(或多个)条件表达式之间的关系。用户可以同时测试多个条件,根据这些条件是否同时成立或者只要有其中一个条件成立等情况,来决定采取何种操作。逻辑测试可以使用的操作选项如下。

>  &&:逻辑与,表示前后两个表达式都成立时整个测试结果才为真,否则结果为假。在使用test命令形式进程测试时,此选项可以改为" -a"。

>   ||:逻辑或,表示前后两个条件至少有一个成立时整个测试结果即为真,否则结果为假。在使用test命令形式进行测试时,此选项可以改为"-o“。

>  !:逻辑否,表示当指定的条件表达式不成立时,整个测试命令的结果为真。

在上述逻辑测试的操作选项中,”&&“和”||“通常也用于间隔不同的命令操作,其作用是相似的。同时使用多个逻辑运算操作时,一般安装从左到右的顺序进行测试。

eg:测试当前的用户是否是teacher,若不是则提示”Not teacher“。

1
2
3
4
echo $USER
root
[ $USER = “teacher” ] || echo  "Not teacher"
Not teacher

eg:只要"/etc/rc.d/rc.local"或者"/etc/init.d/local'中有一个是文件,则显示"YES",否则无任何输出。

1
2
[ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "yes“
yes

eg:测试”/etc/profile“文件是否有可执行权限,若确实没有可执行权限,则提示”No x mode.“的信息。

1
2
[ ! -x ”/etc/profile " ] && echo " No x mode."
No x mode.

eg:若当前的用户是root且使用的Shell程序是"/bin/bash",则显示"YES“,否则无任何输出。

1
2
3
4
echo $USER $SHELL
root /bin/bash
[ $USER = ”root " ] && [ $SHELL = " /bin/bash " ] && echo " yes"
yes

2:if语句的结构:

前面内容知道了一下条件测试操作,实际上使用"&&“和”||“逻辑测试可以完成简单的判断并执行相应的操作,但是当需要选择执行的命令语句较多时,再使用这种方式将使命令行语句显得很复杂,难以阅读。而使用if语句,则可以更好地体现有选择性执行的程序结构,使得层次分明,清晰易懂。

if语句的选择结构由易到难可以分为三种类型,分别适用于不同的应用场合。

2.1、单分支的if语句。

单分支的if语句是最简单的选择结构,这种结果只判断指定的条件,当”条件成立“时执行相应的操作,否则不做任何操作。单分支使用的语句格式如下。

if 条件测试命令

then

 命令序列

fi

在上述语句中,首先通过判断条件测试命令的返回状态值是否为0(条件成立),如果是,则执行then后面的一条或多台可执行语句(命令序列),一直到fi为止表示结束,如果条件测试命令的返回值不为0(条件不成立),则直接去执行fi后面的语句。

2.2、双分支的if语句。

双分支的if语句使用了两路命令操作,在”条件成立‘、“条件不成立时分别执行不同的命令序列”。双分支使用的语句格式如下:

if 条件测试命令

then

命令序列1;

else

命令序列2;

fi

在上述语句中,首先通过if判断条件测试命令的返回状态值是否为0(条件成立),如果是,则执行then后面的一条或多条可执行语句(命令序列1),然后跳转至fi结束判断,如果条件测试命令的返回状态值不为0(条件不成立),则执行else后面的语句,一直到fi表示结束。

2.3、多分支的if语句。

由于if语句可以根据条件测试命令的两种状态分别进行操作,所以能够嵌套使用,进行多次判断(如:首先判断某学生的得分是否及格,如及格则再次判断是否高于90分。。。)多重分支使用的语句格式如下。

if 条件测试命令1

then

命令序列1

elif 条件测试命令2

then

命令序列2

else

命令序列3

fi

上面的语法格式中只嵌套了一个elif语句,实际上if语句中可以嵌套多个elif语句。if语句的嵌套在编写Shell脚本时并不常用,因为多重嵌套容易使程序结构变得复杂。需要使用多重分支程序结构时,更多的是使用case语句来实现。

eg:检查"/var/log/messages'文件是否存在,若存在则统计文件内容的行数并输出,否则不做任何操作。

1
2
3
4
5
6
7
vi  chklog.sh
#!/bin/bash
LogFile= "/var/log/messages"
if  [ -f $LogFile ] ; then
wc -l $LogFile
fi
sh chklog.sh                 //sh是bash的符号链接

eg:提示用户指定备份目录的路径,若目录已存在则显示提示信息后跳过,否则显示相应提示信息后创建该目录。

1
2
3
4
5
6
7
8
9
[root@master ~]# vi mkbak.sh
#!/bin/bash
read -p  "What is your directory:"  Bakdir
if  [ -d $Bakdir ] ; then
echo  "$Bakdir already exist."
else
echo  "Bakdir is not exist,will make it."
mkdir $Bakdir
fi

eg:统计当前登录到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登录的用户账号成名及所在终端。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# vim chkuser.sh
#!/bin/bash
UserNum=`who |wc -l`
if  [ $UserNum -gt  3  ] ; then
echo  "Alert , too many login users ( Total: $UserNum )."
else
  echo  "Login users:"
  who | awk  '{print $1,$2}'
fi

eg:检查portmap进程是否已经存在,若已经存在则输出“portmap service is running”;否则检查是否存在“/etc/rc.d/init.d/portmap”可执行脚本,存在则启动portmap服务,否则提示“no portmap script file.”。


1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# vim chkportmap.sh
#!/bin/bash
pgrep portmap &> /dev/ null
if  [ $? -eq  0  ]; then
echo  "protmap service is running."
elif
[ -x  "/etc/rc.d/init.d/portmap"  ]; then
service portmap start
else
echo  "no portmap script file."
fi

eg:每隔五分钟监测一次mysqld服务程序的运行状态,若发现mysqld进程已终止,则在“/var/log/messages”文件中追加写入日志信息(包括当时时间),并重启mysqld服务,否则不进程任何操作。

1
2
3
4
5
6
7
8
9
10
vi chkmysql.sh
#!/bin/bash
service mysqld status &> /dev/ null
if  [ $? -ne  0  ]; then
echo  "At time:`date`:Mysql Server is down."  >> / var /log/messages
service mysqld restart
fi
chmod u+x chkmysql.sh
crontab -e
*/ 5  * * * * /root/chkmysql.sh

3、使用for魂环语句

在Shell脚本中使用for循环语句时,可以为变量设置一个取值列表,每次读取列表中不同的变量值并执行相关命令操作,变量值用完以后则退出循环。Shell中的for语句不需要执行条件判断,其使用变量的取值来自于预先设置的值列表。

for语句结构:

for 变量名 in 取值列表

do

命令序列

done

在上述语句中,使用in关键字为用户自定义变量设置了一个取值列表(以空格分隔的多个值),for语句第一次执行时首先将列表中的第一个取值赋给该变量。然后执行do后边的命令序列;然后再将列表中的第二个取值赋给该变量,然后执行do后边的命令序列......如此循环,直到取值列表中的所有值都已经用完,最后将跳至done语句,表示结束循环。

for语句示例:

eg:依次输出三条文件信息,包括一天中的"Morning"、"Noon"、"Evening"字串。

1
2
3
4
5
6
vi showday.sh
#!/bin/bash
for  TM  in  "Morning"  "Noon"  "Evening"
do
echo  "The $TM of the day."
done

eg:对于使用“/bin/bash”登录Shell的系统用户,检查他们在"/opt"目录中拥有的子目录或文件数量,如果超过100个,则列出具体数量及对应的用户账号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi chkfileown.sh
#!/bin/bash
DIR= "/opt"                 //设置检查的目标目录
LMT= 100                 //设置文件数量的限制值
ValidUsers=`grep  "/bin/bash"  /etc/passwd | cut -d  ":"  -f  1 `                 //找出使用bash的系统用户列表
for  UserName  in  $ValidUsers
do
Num=`find $DIR -user $UserName | wc -l`               //统计每个用户拥有的文件数
if  [ $Num -gt $LMT ] ; then
echo  "$UserName have $Num files."
fi
done
sh chkfileown.sh
root have  20998  files

4、使用while循环语句

在Shell脚本中使用while循环语句时,将可以根据 特定的条件重复执行一个命令列表,直到该条件不再满足时为至。除非有特别需要,否则在脚本程序中应该是避免出现无限循环执行命令的情况,因为若无法跳出循环的话,后边的某些操作将无法执行。为了控制循环次数,通常会在执行的命令序列中包含修改测试条件的语句,当循环达到一定次数后,测试将不再成立,从而可以结束循环。

while语句的结构:

while 条件测试命令

do

命令序列

done

在上述语句中,首先通过while判断条件测试命令的返回状态值是否为0(条件成立),如果是,则执行do后边的命令序列,然后返回到while再次进行条件测试并判断返回状态值,如果条件仍然成立,则继续执行do后边的命令序列,然后返回到while重复条件测试......如此循环,直到所测试的条件不成立时,跳转到done语句,表示结束循环。

使用while循环语句时,有两个特殊的条件测试返回值,即“true”(真)、"false"(假)。使用“true”作为测试条件时,条件将永远成立,循环体内的语句将无限次执行下去,反之使用“false”则条件永远不成立,循环体内的语句将不会被执行,这两个特殊值也可以用在if语句的条件测试中。

while语句应用示例:

while语句可以用于需要重复操作的循环系统管理任务,并能够通过设置循环条件来灵活的实现各种管理任务。

eg:由用户从键盘输入一个大于1的整数(如50),并计算从1到该数之间各整数的和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# vim sumint.sh
#!/bin/bash
read -p  "Input a number (>1):"  UP
i= 1
Sum= 0
while  [ $i -le $UP ]
do
Sum=`expr $Sum + $i`
i=`expr $i +  1 `
done
echo  "The sum of 1-$UP is : $Sum"
[root@localhost ~]# sh sumint.sh
Input a number (> 1 ): 50
The sum of  1 - 50  is  1275


eg:批量添加20个系统用户账号,用户名称依次为“stu1”、"stu2"、“stu3”、.......“stu20”,各用户的初始密码均设置为“123456”。


1
2
3
4
5
6
7
8
9
[root@localhost ~]# vim add20users.sh
#!/bin/bash
i= 1
while  [ $i -le  20  ]
do
useradd stu$i
echo  "123456"  | passwd --stdin stu$i &> /dev/ null
i=`expr $i +  1 `
done

sh add20users.sh

eg:编写一个批量删除用户的脚本程序,将上面添加的20个用户删除。

1
2
3
4
5
6
7
8
[root@localhost ~]# vim del20users.sh
#!/bin/bash
i= 1
while  [ $i -le  20  ]
do
userdel -r stu$i
i=`expr $i +  1 `
done

再次查看: cat /etc/passwd 就会发现那些用户不再存在。

说了if、for 、while、语句后,就可以编写一般的系统管理任务脚本了,记得多多练习!其实除了这些Shell脚本语句外,还有好多好多,如:

case分支语句,until循环、shift移位,以及break和continue循环中断语句。大家可以查询!后续有时间我也会推出~


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值