Linux总结笔记1-常用命令及脚本基础
1.常用系统工作命令
1 echo 命令用于在终端显示字符串或输出变量提取后的值,格式为:“echo [字符串 | $变量]”。 2 date 命令用于显示及设置系统的时间或日期,格式为:"date [选项] [+指定的格式]"。 3 例如:date "+%Y-%m-%d %H:%M:%S" 4 reboot 命令用于重启系统,格式为:"reboot"。 5 poweroff 命令用于关闭系统,格式为:"poweroff"。 6 wget 命令用于在终端中下载网络文件,格式为:“wget [参数] 下载地址”。 7 “-b”后台下载模式,“-O”下载到指定目录,“-t”最大尝试次数,“-c”断点续传,“-p”下载页面内所有资源,包括图片、视频等,“-r”递归下载 8 ps 命令用于查看系统中的进程状态,格式为:“ps [参数]”。 9 “-a”显示所有的进程(包括其他用户的),“-u”用户以及其他详细信息,“-x”显示没有控制终端的进程 10 top 命令用于动态的监视进程活动与系统负载等信息,格式为:“top”。
1 pidof命令用于查询某个指定服务的进程PID号码值,格式为:“pidof [参数] [服务名称]”。 2 kill命令用于终止某个指定PID号码的进程,格式为:“kill [参数] [进程PID号]”。 3 killall命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [进程名称]”。
2.系统状态检测命令
1 ifconfig用于获取网卡配置与网络状态等信息:格式为"ifconfig [网络设备] [参数]"。 2 uname命令用于查看系统内核与系统版本等信息,格式为:“uname [-a]”。 3 -a参数来完整查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息 4 如果您想查看系统详细版本信息就看redhat-release文件 5 uptime命令用于查看系统的负载信息,格式为:“uptime”。 6 显示当前系统时间、系统已运行时间、当前在线用户以及平均负载值等信息数据 7 free命令用于显示当前系统中内存的使用量信息,格式为:“free [-h]”。 8 who命令用于查看当前登入主机的用户终端信息,格式为:"who [参数]"。 9 last命令用于查看所有系统的登入记录,格式为:"last [参数]"。 10 history命令用于显示历史执行过的命令,格式为:“history [-c]”。 11 改可直接编辑/etc/profile文件的HISTSIZE值, 使用-c参数来清空里面的历史数据, 历史命令会被保存到用户家目录中的".bash_history"文件中 12 sosreport命令用于收集系统配置并诊断信息后输出结论文档,格式为:“sosreport”。
3.工作目录切换命令
1 pwd命令用于显示当前所处的工作目录,格式为:“pwd [选项]”。 2 cd命令用于切换工作路径,格式为:“cd [目录名称]”。 3 ls命令用于显示目录中的文件信息,格式为:“ls [选项] [文件] ”。 4 cat命令用于查看纯文本文件(较短的),格式为:“cat [选项] [文件]”。 5 显示行号的话追加一个“-n”参数 6 more命令用于查看纯文本文件(较长的),格式为:“more [选项] 文件”。 7 head命令用于查看纯文本文档的前N行,格式为:“head [选项] [文件]”。 8 tail命令用于查看纯文本文档的后N行或持续刷新内容,格式为:“tail [选项] [文件]”。 9 持续刷新一个文件的内容追加 "-f" 参数 10 tr命令用于替换文本文件中的字符,格式为:“tr [原始字符] [目标字符]”。 11 先使用cat命令读取待处理的文本内容,然后通过管道符将这些数据传递给tr命令做替换操作即可,例如 cat anaconda-ks.cfg | tr [a-z] [A-Z] 12 wc命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。 13 “-l”只显示行数,"-w"只显示单词数,“-c”只显示字节数 14 stat命令用于查看文件的具体存储信息和时间等信息,格式“stat 文件名称”。 15 cut命令用于按“列”来提取文本字符,格式为:“cut [参数] 文本”。 16 使用“-f”参数来设置需要看的列数,还必须使用“-d”参数来设置间隔符号,例如 cut -d: -f1 /etc/passwd 17 diff命令用于比较多个文本文件的差异,格式为:"diff [参数] 文件"。 18 可以使用“--brief”参数来仅仅确认两个文件是否不同;还可以使用“-c”参数来详细比较出多个文件的差异之处
4.文件目录管理命令
1 touch命令用于创建空白文件与设置文件的各种时间,格式为:“touch [选项] [文件]”。 2 3 参数“-a”仅修改访问时间atime ,“-m”仅修改更改时间mtime,“-d”同时修改atime和mtime。例如:touch -d "2016-05-04 15:44" anaconda-ks.cfg 4 whereis命令找出命令所对应的保存路径,格式为:“whereis [命令]”。 5 mkdir用于创建空白的文件夹,格式为:“mkdir [选项] 目录”。 6 使用“-p”参数来递归创建出具有嵌套叠层关系的文件目录 7 cp命令用于复制文件或目录,格式为:“cp [选项] 源文件 目标文件”。 8 “-p”保留原始文件的属性,“-d”若对象为"链接文件",则保留该"链接文件"的属性,“-r”递归持续复制(用于目录),
“-i”若目标文件存在则询问是否覆盖,“-a”相当于-pdr(p,d,r为上述的参数) 9 mv命令用于移动文件或改名,格式为:“mv [选项] 源文件 [目标路径|目标文件名]”。 10 rm命令用于删除文件或目录,格式为:“rm [选项] 文件”。 11 使用“-f”参数来直接强制删除,“-r”参数删除目录文件夹 12 dd命令用于指定大小的拷贝文件或指定转换文件,格式为:“dd [参数]”。 13 if=输入的文件名称,of=输出的文件名称,bs=设置每个“块”的大小,count=设置要拷贝“块”的个数,例如:dd if=/dev/zero of=560_file count=1 bs=560M 14 可以直接使用这个dd命令来复制并压制光盘设备变成一个可立即使用的iso镜像,例如:dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso 15 file命令用于查看文件的类型,格式为:“file 文件名”。
5.打包压缩与搜索命令
1 tar命令用于对文件打包压缩或解压,格式为:“tar [选项] [文件]”。 2 “-c”参数是用于创建压缩文件的,“-x”参数是用于解压文件,“-z”参数是指定使用Gzip格式来压缩解压文件,“-j”参数是指定使用bzip2参数来压缩解压文件, 3 -v”参数来不断显示压缩或解压的进度,“-C”参数用于指定要解压到的那个指定的目录,而“-f”参数代表要压缩或解压的软件包名称。 4 一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”命令来将指定的文件来打包,解压的话则是“tar -xzvf 压缩包名称.tar.gz”命令 5 grep命令用于对文本内容进行关键词的搜索匹配,格式为:“grep [选项] [文件]”。 6 使用“-n”参数显示搜索到信息的行号,使用“-v”参数用于反选信息(即没有包含关键词的所有信息行) 7 find命令用于查找文件,格式为:“find [查找路径] 寻找条件 操作”。 8 "-name" 匹配名称, 9 "-perm" 匹配权限(mode为完全匹配,"-mode为包含即可), 10 "-user" 匹配所有者, 11 "-group" 匹配所有组, 12 "-mtime -n +n" 匹配修改内容的时间("-n指n天以内,+n指n天以前), 13 "-atime -n +n" 匹配访问文件的时间"-n指n天以内,+n指n天以前, 14 "-ctime -n +n" 匹配修改权限的时间"-n指n天以内,+n指n天以前, 15 "-nouser" 匹配无所有者的文件, 16 "-nogroup" 匹配无所有组的文件, 17 "-newer f1 !f2" 匹配比文件f1新却比f2旧的文件, 18 "--type b/d/c/p/l/f" 匹配文件类型(块设备、目录、字符设备、管道、链接文件、文件文件), 19 "-size" 匹配文件的大小(+50k查找超过50k的文件,而"-50k则代表查找小于50k的文件), 20 "-prune" 忽略某个目录, 21 "-exec {} \;" 后面可接对搜索到结果进一步处理的命令(下面会有演示)例如: find / -user linuxprobe -exec cp -a {} /root/findresults/ \;
6.输入输出重定向
标准输入(STDIN,文件描述符为0):默认从键盘输入,为0时表示是从其他文件或命令的输入。
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件。
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件。
对于输入重定向有这些情况:
符号 | 作用 |
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见“分界符”才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向符有这些情况:
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
7.管道命令符
管道命令符的作用一句话就能概括:“将前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入”。
8.命令行的通配符
通配符顾名思义就是通用的匹配信息的符号,比如星号(*)就是代表匹配零个或多个字符,问号(?)是代表匹配单个字符,括号内加上数字([0-9])代表匹配单个阿拉伯数字的字符而括号内加上字母([abc])则是代表匹配单个指定的英文字母。
9.常用的转义字符
常见的转义字符包括有:反斜杠(\)的作用就是转义后面的一个字符变为单纯的字符串,单引号('')则是转义其中所有的字符为单纯的字符串,而双引号("")是保留其中的变量属性不转义,反引号(``)则是将其中的命令执行后返回一个结果。
10.重要的环境变量
当用户执行了一条命令之后到底发生了什么事情呢?简单来说就是四个步骤:
1.第一步是判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
2.第二步是检查用户输入的命令是否为“别名命令”,即用一个自创的命令名称来替换原本的命令名称。(咱们可以用alias命令来创建自己的命令别名,格式为:“alias 别名=命令”,若要取消一个别名的话则是用unalias命令,格式为:“unalias 别名”。例如咱们以前用rm命令删除文件的时候都要被要求再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,咱们可以将它取消掉)
3.第三步是由SHELL解释器(Bash)来判断用户输入的是内部命令还是外部命令,内部命令是解释器内部的指令,会被直接的执行,而绝大部分的时候都会是外部命令,交由给第四步骤来继续处理。(当然您还可以使用“type 命令名称”来手工判断是内部命令还是外部命令,也是很有趣的。)
4.第四步是系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH,可以简单把它理解成是“解释器的小助手”,作用是告诉解释器要执行的命令可能存放到了那里,然后bash就会乖乖的在这些目录中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,咱们对这些路径的增加和删除操作就是在直接影响bash解释器搜索linux命令的位置。
11.Vim文本编辑器
命令模式:控制光标移动,可对文本进行删除、复制、粘贴和查找等工作。
输入模式:正常的文本录入。
末行模式:保存、退出与设置编辑环境。
命令模式快捷键命令
命令 | 作用 |
dd | 删除(剪切)光标所在整行。 |
5dd | 删除(剪切)从光标处开始的5行。 |
yy | 复制光标所在整行。 |
5yy | 复制从光标处开始的5行。 |
n | 显示搜索命令定位到的下一个字符串。 |
N | 显示搜索命令定位到的上一个字符串。 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后。 |
?字符串 | 在文本中从下至上搜索该字符串。 |
/字符串 | 在文本中从上至下搜索该字符串。 |
末行模式 快捷键命令
命令 | 作用 |
:w | 保存 |
:q | 退出 |
:q! | 强制退出(放弃对文本的修改内容) |
:wq! | 强制保存退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
:s/one/two | 将当前光标所在行的第一个one替换成two |
:s/one/two/g | 将当前光标所在行的所有one替换成two |
:%s/one/two/g | 将全文中的所有one替换成two |
12.配置网卡信息
1 第1步:首先咱们要切换到"/etc/sysconfig/network-scripts"目录中(该目录存放着网卡的配置文件)。 2 3 第2步:使用vim编辑器修改网卡文件"ifcfg-eno16777736",逐项写入配置参数,并保存退出。 4 5 设备类型:TYPE=Ethernet 6 7 地址分配模式:BOOTPROTO=static 8 9 网卡名称:NAME=eno16777736 10 11 是否启动:ONBOOT=yes 12 13 IP地址:IPADDR=192.168.10.10 14 15 子网掩码:NETMASK=255.255.255.0 16 17 网关地址:GATEWAY=192.168.10.1 18 19 DNS地址:DNS1=192.168.10.1 20 21 第3步:重启网卡设备并测试网络是否联通。
13.配置Yum仓库
1 第1步:首先咱们要进入到"/etc/yum.repos.d/"目录中(因为该目录存放着yum仓库的配置文件) 2 3 第2步:使用vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必需为repo),逐项写入配置参数并保存退出。 4 5 [rhel-media]:yum仓库唯一标识符,避免与其他仓库冲突。 6 7 name=linuxprobe :yum仓库的名称描述,易于识别仓库用处。。 8 9 baseurl=file:///media/cdrom :提供方式包括FTP(ftp://..)、HTTP(http://..)、本地(file:///..) 10 11 enabled=1 : 设置此源是否可用,1为可用,0为禁用。 12 13 gpgcheck=1 : 设置此源是否校验文件,1为校验,0为不校验。 14 15 gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release :若为校验请指定公钥文件地址。 16 17 第3步:按配置参数的路径将光盘挂载,并将光盘挂载信息写入到/etc/fstab文件中。 18 第4步:使用"yum clean all" 和"yum list" 和命令检查Yum仓库是否已经可用。
14.编写简单的脚本
1 [root@kangvcar ~]# vim example.sh 2 #!/bin/bash 3 #For Example BY kangvcar 4 pwd 5 ls -al 6 第一行脚本声明(#!)是用来告知系统用何种shell解释器来执行本脚本程序 7 第二行注释信息(#)是对程序功能和某些命令的介绍信息,使得自己或他人再次看到这个脚本内容时可以快速知道这些功能的作用或一些警告信息 8 第三、四行可执行语句也就是咱们平时执行的Linux命令 9 10 可以用以下两种方式执行脚本(第二种方法需要有执行权限) 11 [root@kangvcar ~]# bash example.sh 12 [root@kangvcar ~]# ./example.sh
15.接收用户的参数
$0对应当前Shell脚本程序的名称
$#对应总共有几个参数
$*对应所有位置的参数值
$1,$2,$3……依次类推则分别对应着第N个位置的参数
1 [root@kangvcar ~]# vim example.sh 2 #!/bin/bash 3 echo "当前脚本名称为$0" 4 echo "总共有$#个参数,分别是$*。" 5 echo "第1个参数为$1,第5个为$5。" 6 7 [root@kangvcar ~]# sh example.sh one two three four five six 8 当前脚本名称为example.sh 9 总共有6个参数,分别是one two three four five six。 10 第1个参数为one,第5个为five。
16.判断用户的参数
条件测试语法能够判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。
条件判断语句按照测试对象可分为文件测试、逻辑测试、整数值比较与字符串比较
文件测试即用来按照指定条件来判断文件是否存在或权限是否满足,具体的参数包括有:
操作符 | 作用 |
-d | 测试是否为目录。 |
-e | 测试文件或目录是否存在。 |
-f | 判断是否为文件。 |
-r | 测试当前用户是否有权限读取。 |
-w | 测试当前用户是否有权限写入。 |
-x | 测试当前用户是否有权限执行。 |
通过文件测试语句来判断/etc/fstab是否为一个目录文件,然后通过$?变量来显示上一条命令执行后的返回值,这样就可以通过返回的非零值判断目录是不存在的了:
1 [root@kangvcar ~]# [ -d /etc/fstab ] 2 [root@kangvcar ~]# echo $? 3 1
用文件测试语句来判断下/etc/fstab是否为一般文件,这样看到返回值是0即代表这个一般文件是存在的:
1 [root@kangvcar ~]# [ -f /etc/fstab ] 2 [root@kangvcar ~]# echo $? 3 0
逻辑测试则是用于判断用户给出的条件是为真还是假,从而将条件测试语句与逻辑语句相搭配结合使用可以实现一个更高级的使用方法.
例如在Shell终端中逻辑“与”符号是&&,它代表当前面的命令执行成功后才会执行后面的命令,因此可以用来判断/dev/cdrom设备是否存在,若存在时才输出Exist字样。
1 [root@kangvcar ~]# [ -e /dev/cdrom ] && echo "Exist" 2 Exist
除了“与”逻辑测试符号外还有“或”逻辑测试,在Linux系统中的逻辑“或”符号为“||”,它代表当前面的命令执行失败后才会执行后面的命令,因此可以结合系统环境变量来判断当前登录的用户是否为非超级管理员身份
1 [kangvcar @localhost ~]$ [ $USER = root ] || echo "user" 2 user
逻辑“非”的符号就是一个叹号,它代表将条件测试中的判断结果取相反值,也就是说原本测试的结果是正确,则变成错误,而错误的结果会变成正确,有一种负负为正的感觉。例如咱们现在切换到一个普通用户的身份后再来判断当前用户是不是一个非超级管理员的用户,判断结果因为两次否定而变成正确,因此会正常的输出预设信息
1 [root@kangvcar ~]# [ $USER != root ] || echo "administrator" 2 administrator
下面这个例子的执行顺序是先判断当前登录用户的环境变量名称是否不等于root,即判断他是否为普通用户,若条件成立则会根据逻辑“与”运算符输出user字样,而如果条件不满足则会通过逻辑“或”运算符输出root字样,即如果前面的&&不成立才会执行后面的||符号。
1 [root@kangvcar ~]# [ $USER != root ] && echo "user" || echo "root" 2 root
整数比较运算符是仅对数字的测试操作,不能将数字与字符串、文件等内容一起操作
操作符 | 作用 |
-eq | 判断是否等于 |
-ne | 判断是否不等于 |
-gt | 判断是否大于 |
-lt | 判断是否小于 |
-le | 判断是否等于或小于 |
-ge | 判断是否大于或等于 |
字符串比较是判断测试字符串是否为空值,或两个字符串是否相同的操作,常常用来判断某个变量是否未被定义(即内容为空值),理解起来也比较简单,常见的操作运算符如下:
操作符 | 作用 |
= | 比较字符串内容是否相同。 |
!= | 比较字符串内容是否不同。 |
-z |
判断字符串内容是否为空。
|
17.1 if条件测试语句
从技术角度上来说分为单分支结构、双分支结构、多分支结构
单分支的if条件语句结构,这种结构仅用if、then、fi关键词组成,只在条件成立后才执行预设命令
使用单分支的if条件语句来判断某个目录是否存在,若已经存在就结束条件判断和整个Shell脚本,而如果不存在则去创建这个目录:
1 [root@kangvcar ~]# vim mkcdrom.sh 2 #!/bin/bash 3 DIR="/media/cdrom" 4 if [ ! -e $DIR ] 5 then 6 mkdir -p $DIR 7 fi 8 [root@kangvcar ~]# bash mkcdrom.sh 9 [root@kangvcar ~]# ls -d /media/cdrom 10 /media/cdrom
双分支的if条件语句结构,这种结构仅用if、then、else、fi关键词组成,进行两次条件判断匹配,两次判断中任何一项匹配成功后都会执行预设命令
使用双分支的if条件语句来验证某个主机是否在线,然后根据判断执行返回值结果分别给予对方主机是在线还是不在线的提示信息,脚本中我主要是使用ping命令来测试与对方主机的网络联通性,而linux系统中的ping命令不像windows系统一样仅会尝试四次就结束,因此为了避免用户等待时间过长,咱们通过-c参数来规定尝试的次数,-i参数定义每个数据包的发送间隔时间以及-W参数定义最长的等待超时时间。
1 [root@kangvcar ~]# vim chkhost.sh 2 #!/bin/bash 3 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null 4 if [ $? -eq 0 ] 5 then 6 echo "Host $1 is On-line." 7 else 8 echo "Host $1 is Off-line." 9 fi 10 [root@linuxprobe ~]# bash chkhost.sh 192.168.10.10 11 Host 192.168.10.10 is On-line. 12 [root@linuxprobe ~]# bash chkhost.sh 192.168.10.20 13 Host 192.168.10.20 is Off-line.
多分支的if条件语句结构,这种结构需要使用if、then、else、elif、fi关键词组成,进行多次条件判断匹配,多次判断中任何一项匹配成功后都会执行预设命令
使用多分支的if条件语句来判断用户输入的分数在那个成绩区间内,然后输出如优秀、合格、不合格等提示信息,read是用来读取用户输入信息的命令,它能够将接收到的用户输入信息赋值给后面的指定变量,而-p参数则是给予了用户一定的提示信息。下面实例中判断用户输入的分数是否同时具备大于等于85分且小于等于100分,这样的话才输出Excellent字样,若上一条件没有匹配成功则继续判断用户输入分数是否大于等于70分且小于等于84分,这样的话输出Pass字样,如果两次都落空没有匹配成功,则最终输出Fail字样:
1 [root@kangvcar ~]# vim chkscore.sh 2 #!/bin/bash 3 read -p "Enter your score(0-100):" GRADE 4 if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then 5 echo "$GRADE is Excellent" 6 elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then 7 echo "$GRADE is Pass" 8 else 9 echo "$GRADE is Fail" 10 fi 11 [root@kangvcar ~]# bash chkscore.sh 12 Enter your score(0-100):88 13 88 is Excellent 14 [root@kangvcar ~]# bash chkscore.sh 15 Enter your score(0-100):80 16 80 is Pass
17.2 for条件循环语句
1 for循环语句可以让脚本一次性读取多个信息值,然后逐一对信息值进行循环操作处理,因此当你要处理的数据是有目标和范围时简直再适合不过了 2 首先创建用户名称的列表文件,将每个用户名称单独占一行,当然具体的用户名称和个数都是可以由您来决定的: 3 [root@kangvcar ~]# vim users.txt 4 andy 5 barry 6 carl 7 duke 8 eric 9 george 10 Shell脚本中使用read命令来读取用户输入的要设置密码值后赋值给PASSWD变量,并通过-p参数来显示一段给用户的提示内容,告诉用户正在输入的内容即将作为帐号密码。
当下面的脚本执行后会自动的用users.txt列表文件中获取到所有的用户名称值,然后逐一使用id 用户名的方式查看用户的信息,并使用$?变量判断这条命令是否执行成功,
也就是判断该用户是否已经存在。而/dev/null是被称作Linux的黑洞的文件,将输出信息重定向输出到这个文件后等同于删除数据,让我们用户的屏幕保持简洁。 11 [root@kangvcar ~]# vim Example.sh 12 #!/bin/bash 13 read -p "Enter The Users Password : " PASSWD 14 for UNAME in `cat users.txt` 15 do 16 id $UNAME &> /dev/null 17 if [ $? -eq 0 ] 18 then 19 echo "Already exists" 20 else 21 useradd $UNAME &> /dev/null 22 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null 23 if [ $? -eq 0 ] 24 then 25 echo "$UNAME , Create success" 26 else 27 echo "$UNAME , Create failure" 28 fi 29 fi 30 done
17.3 while条件循环语句
1 while循环语句判断是否继续执行命令的依据一般是检查若条件为真就继续执行,而条件为假就结束循环 2 脚本中会使用$RANDOM变量来调取出一个随机的数值(范围:0--32767),然后通过expr命令计算取整出1000以内的一个随机数值,用这个数值来跟用户通过read命令输入的数值做比较判断。
判断语句结构分为三项,分别是判断是否相等、是否大于随机值以及是否小于随机值,但这不是重点~关键是在于while条件循环语句的判断值为true,因此会无限的运行下去,
直到猜中后运行exit 0命令才终止脚本。 3 [root@linuxprobe ~]# vim Guess.sh 4 #!/bin/bash 5 PRICE=$(expr $RANDOM % 1000) 6 TIMES=0 7 echo "商品实际价格为0-999之间,猜猜看是多少?" 8 while true 9 do 10 read -p "请输入你猜测的价格数目:" INT 11 let TIMES++ 12 if [ $INT -eq $PRICE ] ; then 13 echo "恭喜你答对了,实际价格是 $PRICE" 14 echo "你总共猜测了 $TIMES 次" 15 exit 0 16 elif [ $INT -gt $PRICE ] ; then 17 echo "太高了!" 18 else 19 echo "太低了!" 20 fi 21 done
17.4 case条件测试语句
1 case条件测试语句是在多个范围内匹配数据,若匹配到则执行相关命令并结束整个条件测试,而如果数据不在所列出的范围内,则会去执行*)中所规定的默认命令 2 提示用户输入一个字符并将其赋值给变量KEY,判断变量KEY为何种字符后分别输出是字母、数字还是其他字符 3 [root@linuxprobe ~]# vim Checkkeys.sh 4 #!/bin/bash 5 read -p "请输入一个字符,并按Enter键确认:" KEY 6 case "$KEY" in 7 [a-z]|[A-Z]) 8 echo "您输入的是 字母。" 9 ;; 10 [0-9]) 11 echo "您输入的是 数字。" 12 ;; 13 *) 14 echo "您输入的是 空格、功能键或其他控制字符。" 15 esac 16 [root@linuxprobe ~]# bash Checkkeys.sh 17 请输入一个字符,并按Enter键确认:6 18 您输入的是 数字。 19 [root@linuxprobe ~]# bash Checkkeys.sh 20 请输入一个字符,并按Enter键确认:p 21 您输入的是 字母。 22 [root@linuxprobe ~]# bash Checkkeys.sh 23 请输入一个字符,并按Enter键确认:^[[15~ 24 您输入的是 空格、功能键或其他控制字符。
17.5 计划任务服务程序
1 一次性计划任务顾名思义就只是一次性有效,一般用于临时的工作需要,我们可以用at命令实现这种功能,一般只需要写成"at 时间"的形式就可以,
如果想要查看已设置好但还未执行的计划任务可以用"at -l"命令,而删除的话可以用"atrm 任务序号"即可,默认用at命令来设置计划任务的话是通过交互式的方法,
例如我们设置系统在今晚23:30分自动重启网站服务吧: 2 [root@linuxprobe ~]# at 23:30 3 at > systemctl restart httpd 4 at > 此处请同时按下Ctrl+d来结束编写计划任务 5 job 3 at Mon Apr 27 23:30:00 2015 6 [root@linuxprobe ~]# at -l 7 3 Mon Apr 27 23:30:00 2016 a root 8 想要删除其中一条的话也是很简单的: 9 [root@linuxprobe ~]# atrm 3 10 [root@linuxprobe ~]# at -l 11 12 如果您的工作需要是有周期规律性的,那Linux系统中默认启用的crond服务简直再适合不过了,创建、编辑计划任务的命令为"crontab -e",
查看当前计划任务的命令为"crontab -l",删除某条计划任务的命令为"crontab -r",另外如果您登录的是超级用户的话,还可以通过加上-u参数来编辑其他人的计划任务。
不过在正式的部署计划任务前,请先跟我念一下口诀“分、时、日、月、星期 命令”,这是使用crond服务设置任务的参数格式,没有设置的位置也要用*号占位,如图所示:
字段 | 说明 |
分钟 | 取值为从0到59之间的整数 |
小时 | 取值为从0到23之间的任意整数 |
日期 | 取值为1到31之间的任意整数 |
月份 | 取值为1到12之间的任意整数 |
星期 | 取值为0到7之间的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
1 参考上面crond计划任务实现的参数格式,假设目前咱们每周一、三、五的凌晨3点25分都需要将某个网站数据目录通过tar命令打包成一个压缩包来当做备份文件,
那么我们除了用减号(-)来表示一段连续的时间周期,例如12-15就可以代表每月的12-15日,除号(/)代表任务的间隔时间,
例如/2就是每隔2分钟执行一次的意思,还可以用逗号(,)来分别表示多个时间段,如8,9,12来代表八月、九月和12月执行任务,那么我们来尝试做一下吧: 2 [root@linuxprobe ~]# crontab -e 3 no crontab for root - using an empty one crontab: installing new crontab 4 [root@linuxprobe ~]# crontab -l 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 5 6 而如果我们的计算机服务器中需要有多条计划任务,并且这次的工作是每周一至五的每天的凌晨1点钟清空/tmp临时目录中的所有文件,就可以将相应的参数依次写到下面,
而在crond服务的计划任务参数中所有的命令请一定要用绝对路径的方式来写,如果不知道的话用whereis命令来查下吧: 7 [root@linuxprobe ~]# whereis rm rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz 8 [root@linuxprobe ~]# crontab -e 9 crontab: installing new crontab 10 [root@linuxprobe ~]# crontab -l 11 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 12 0 1 * * 1-5 /usr/bin/rm -rf /tmp/* 13 建议,首先是crond服务的配置参数中可以像Shell脚本一样以#号开头来写上注释信息,这样方便以后再看到这段命令代码时快速回忆起功能、需求以及当时编写人等等重要信息,
其次是计划任务中的分钟项目必须有数值,绝对不能为空或是*号,而日和周不能同时使用,否则就会发生冲突,这些细节我想您一定要记下.
本文为博主原创文章,知识共享,开源精神,转载注明出处。欢迎技术交流 QQ819509322