Linux就该这么学 20181003(第四章Vim/shell/测试条件)
参考链接https://www.linuxprobe.com/
vim文本编辑器 命令模式:控制光标移动,可对文本进行复制,黏贴,删除和查找工作 输入模式:正常的文本录入 末行模式:保存或退出文档,以及设置编辑环境 命令模式常用的一些命令 dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在整行 5yy 复制从光标处开始的5行 n 显示搜索命令定位到的下一个字符串 N 显示搜索命令定位到的上一个字符串 u 撤销上一步的操作 p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 ggdG 删除全部 魔航模式 命令 作用 :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 ?字符串 在文本中从下至上搜索该字符串 /字符串 在文本中从上至下搜索该字符串 ps: :%s/one/two/g 将全文的所有one替换成two 使用a、i、o三个键从命令模式切换到输入模式。其中,a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光 标的下面再创建一个空行 修改主机名 vim /etc/hostname #linuxprobe.com PS:重启后才生效 hostname 配置网卡信息 在RHEL5,6网卡配置文件都是以eth开头,第一块eth0,第二块eth1 但是在RHEL7中 ,网卡配置文件以ifcfg开始 如ifcfg-eno16777736 现在有一个名为ifcfg-eno16777736网卡设备,将其配置为开机自启动,并设置IP cd /etc/sysconfig/network-scripts目录中 vim编辑器修改网卡文件 ,写入后保存 设备类型:TYPE=Ethernet 地址分配模式:BOOTPROTO=static 网卡名称:NAME=eno16777736 是否启动:ONBOOT=yes IP地址:IPADDR=192.168.10.10 子网掩码:NETMASK=255.255.255.0 网关地址:GATEWAY=192.168.10.1 DNS地址:DNS1=192.168.10.1 ## [root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/ [root@linuxprobe network-scripts]# vim ifcfg-eno16777736 TYPE=Ethernet BOOTPROTO=static NAME=eno16777736 ONBOOT=yes IPADDR=192.168.10.10 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=192.168.10.1 systemctl restart network 配置yum仓库 第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件)。 第2步:使用Vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须为.repo),逐项写入下面加粗的配置参数并 保存退出(不要写后面的中文注释)。 [rhel-media] :Yum软件仓库唯一标识符,避免与其他仓库冲突。 name=linuxprobe:Yum软件仓库的名称描述,易于识别仓库用处。 baseurl=file:///media/cdrom:提供的方式包括FTP(ftp://..)、HTTP(http://..)、本地(file:///..)。 enabled=1:设置此源是否可用;1为可用,0为禁用。 gpgcheck=1:设置此源是否校验文件;1为校验,0为不校验。 gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校验,那么请指定公钥文件地址。 第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中。 第4步:使用“yum install httpd -y”命令检查Yum软件仓库是否已经可用。 进入/etc/yum.repos.d目录中后创建Yum配置文件: [root@linuxprobe ~]# cd /etc/yum.repos.d/ [root@linuxprobe yum.repos.d]# vim rhel7.repo [rhel7] name=rhel7 baseurl=file:///media/cdrom enabled=1 gpgcheck=0 创建挂载点后进行挂载操作,并设置成开机自动挂载(详见第6章)。尝试使用Yum软件仓库来安装Web服务,出现Complete!则代表配置正 确: [root@linuxprobe yum.repos.d]# mkdir -p /media/cdrom [root@linuxprobe yum.repos.d]# mount /dev/cdrom /media/cdrom mount: /dev/sr0 is write-protected, mounting read-only [root@linuxprobe yum.repos.d]# vim /etc/fstab /dev/cdrom /media/cdrom iso9660 defaults 0 0 [root@linuxprobe ~]# yum install httpd Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分输出信息……………… Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: httpd x86_64 2.4.6-17.el7 rhel 1.2 M Installing for dependencies: apr x86_64 1.4.8-3.el7 rhel 103 k apr-util x86_64 1.5.2-6.el7 rhel 92 k httpd-tools x86_64 2.4.6-17.el7 rhel 77 k mailcap noarch 2.1.41-2.el7 rhel 31 k Transaction Summary ================================================================================ Install 1 Package (+4 Dependent packages) Total download size: 1.5 M Installed size: 4.3 M Is this ok [y/d/N]: y Downloading packages: -------------------------------------------------------------------------------- ………………省略部分输出信息……………… Complete! #参数 [root@linuxprobe ~]# ./example.sh bash: ./Example.sh: Permission denied [root@linuxprobe ~]# chmod u+x example.sh $# 表示有多个参数 $* 表示参数分别是 $1 - $9 - ${10} 表示传的参数 测试语句格式: [ 条件表达式 ] 文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符, -d 测试文件是否为目录类型 -f 判断是否为一般文件 -e 测试文件是否存在 -r 测试当前用户是否有权限读取 -w 测试当前是否有写入权限 -x 测试当前用户执行权限 [ -d /root/tmp ] echo $? #如果为真 0 假为1 与 && 或 || 非 ! 等于 == [ $USER != root ] echo $? 整数比较运算符仅对数字进行操作 -eq 是否等于 -ne 是否不等于 -gt 大于 -lt 小于 -le 小于或等于 -ge 大于或等于 [root@linuxprobe ~]# free -m total used free shared buffers cached Mem: 1826 1244 582 9 1 413 -/+ buffers/cache: 830 996 Swap: 2047 0 2047 [root@linuxprobe ~]# free -m | grep Mem: Mem: 1826 1244 582 9 [root@linuxprobe ~]# free -m | grep Mem: | awk '{print $4}' 582 [root@linuxprobe ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'` [root@linuxprobe ~]# echo $FreeMem [ $FreeMem -lt 1024 ] && echo "Insufficient Memory" 字符串比较用于判断测试字符串是否为空值 = 比较字符串内容是否相同 != 字符串内容不等于 -z 判断字符串内容是否为空 [ -z $String ] 流程控制语句 if for while case 下面使用单分支的if条件语句来判断/media/cdrom文件是否存在,若存在就结束条件判断和整个Shell脚本,反之则去创建这个目录: [root@linuxprobe ~]# vim mkcdrom.sh #!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then mkdir -p $DIR fi if then else fi if 条件测试 then 命令1 elif 条件测试 then 命令2 fi for循环条件语句 for 变量名 in 取值列表 do 命令序列 done for 用户名 in 列表文件 do 创建用户并设置密码 done [root@linuxprobe ~]# vim Example.sh #!/bin/bash read -p "Enter The Users Password : " PASSWD for UNAME in `cat users.txt` do id $UNAME &> /dev/null 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@linuxprobe ~]# vim CheckHosts.sh #!/bin/bash HLIST=$(cat ~/ipadds.txt) for IP in $HLIST do ping -c 3 -i 0.2 -W 3 $IP &> /dev/null if [ $? -eq 0 ] ; then echo "Host $IP is On-line." else echo "Host $IP is Off-line." fi done [root@linuxprobe ~]# ./CheckHosts.sh Host 192.168.10.10 is On-line. Host 192.168.10.11 is Off-line. Host 192.168.10.12 is Off-line. while条件循环语句 while 条件测试操作 do 命令序列 done case条件测试语句 case 变量值 in 模式1) 命令1 ;; 模式2) 命令2 ;; *) 默认命令序列 esac read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z]|[A-Z]) echo "您输入的是 字母。" ;; [0-9]) echo "您输入的是 数字。" ;; *) echo "您输入的是 空格、功能键或其他控制字符。" esac 计划任务服务程序 定时任务只执行一次 用at #at -l 查看定时任务列表 #atrm 任务号 删除 [root@linuxprobe ~]# at 23:30 at > systemctl restart httpd at > 此处请同时按下Ctrl+d来结束编写计划任务 job 3 at Mon Apr 27 23:30:00 2015 crontab 分 时 日 月 星期命令 #crontab -e 编辑 #crontab -l 罗列 字段 说明 分钟 取值为0~59的整数 小时 取值为0~23的任意整数 日期 取值为1~31的任意整数 月份 取值为1~12的任意整数 星期 取值为0~7的任意整数,其中0与7均为星期日 命令 要执行的命令或程序脚本 #假设在每周一、三、五的凌晨3点25分,都需要使用tar命令把某个网站的数据目录进行打包处理 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突 1.Vim编辑模式三种分别是命令模式、末行模式、输入模式 2. $0表示脚本文件名 3.if then elif then else fi 4.for 变量名 in 取值列表 do .. done 5.根据用户输入的不同最好执行case条件语句 6.唱起计划任务使用的服务是 crontab -e 分 时 日 月 星期
vim文本编辑器命令模式:控制光标移动,可对文本进行复制,黏贴,删除和查找工作输入模式:正常的文本录入末行模式:保存或退出文档,以及设置编辑环境
命令模式常用的一些命令dd删除(剪切)光标所在整行5dd删除(剪切)从光标处开始的5行yy复制光标所在整行5yy复制从光标处开始的5行n显示搜索命令定位到的下一个字符串N显示搜索命令定位到的上一个字符串u撤销上一步的操作p将之前删除(dd)或复制(yy)过的数据粘贴到光标后面ggdG删除全部
魔航模式命令作用: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?字符串在文本中从下至上搜索该字符串 /字符串在文本中从上至下搜索该字符串ps: :%s/one/two/g 将全文的所有one替换成two
使用a、i、o三个键从命令模式切换到输入模式。其中,a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光
标的下面再创建一个空行
修改主机名vim /etc/hostname#linuxprobe.com PS:重启后才生效 hostname
配置网卡信息在RHEL5,6网卡配置文件都是以eth开头,第一块eth0,第二块eth1但是在RHEL7中 ,网卡配置文件以ifcfg开始 如ifcfg-eno16777736现在有一个名为ifcfg-eno16777736网卡设备,将其配置为开机自启动,并设置IPcd /etc/sysconfig/network-scripts目录中vim编辑器修改网卡文件 ,写入后保存设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=eno16777736
是否启动:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子网掩码:NETMASK=255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1
##[root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/[root@linuxprobe network-scripts]# vim ifcfg-eno16777736TYPE=EthernetBOOTPROTO=staticNAME=eno16777736ONBOOT=yesIPADDR=192.168.10.10NETMASK=255.255.255.0GATEWAY=192.168.10.1DNS1=192.168.10.1
systemctl restart network
配置yum仓库第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件)。
第2步:使用Vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须为.repo),逐项写入下面加粗的配置参数并
保存退出(不要写后面的中文注释)。
[rhel-media] :Yum软件仓库唯一标识符,避免与其他仓库冲突。
name=linuxprobe:Yum软件仓库的名称描述,易于识别仓库用处。
baseurl=file:///media/cdrom:提供的方式包括FTP(ftp://..)、HTTP(http://..)、本地(file:///..)。
enabled=1:设置此源是否可用;1为可用,0为禁用。
gpgcheck=1:设置此源是否校验文件;1为校验,0为不校验。
gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校验,那么请指定公钥文件地址。
第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中。
第4步:使用“yum install httpd -y”命令检查Yum软件仓库是否已经可用。
进入/etc/yum.repos.d目录中后创建Yum配置文件:
[root@linuxprobe ~]# cd /etc/yum.repos.d/[root@linuxprobe yum.repos.d]# vim rhel7.repo[rhel7]name=rhel7baseurl=file:///media/cdromenabled=1gpgcheck=0
创建挂载点后进行挂载操作,并设置成开机自动挂载(详见第6章)。尝试使用Yum软件仓库来安装Web服务,出现Complete!则代表配置正
确:
[root@linuxprobe yum.repos.d]# mkdir -p /media/cdrom[root@linuxprobe yum.repos.d]# mount /dev/cdrom /media/cdrommount: /dev/sr0 is write-protected, mounting read-only[root@linuxprobe yum.repos.d]# vim /etc/fstab/dev/cdrom /media/cdrom iso9660 defaults 0 0[root@linuxprobe ~]# yum install httpdLoaded plugins: langpacks, product-id, subscription-manager………………省略部分输出信息………………Dependencies Resolved================================================================================ Package Arch Version Repository Size================================================================================Installing: httpd x86_64 2.4.6-17.el7 rhel 1.2 MInstalling for dependencies: apr x86_64 1.4.8-3.el7 rhel 103 k apr-util x86_64 1.5.2-6.el7 rhel 92 k httpd-tools x86_64 2.4.6-17.el7 rhel 77 k mailcap noarch 2.1.41-2.el7 rhel 31 kTransaction Summary================================================================================Install 1 Package (+4 Dependent packages)Total download size: 1.5 MInstalled size: 4.3 MIs this ok [y/d/N]: yDownloading packages:--------------------------------------------------------------------------------………………省略部分输出信息………………Complete!
#参数[root@linuxprobe ~]# ./example.shbash: ./Example.sh: Permission denied[root@linuxprobe ~]# chmod u+x example.sh
$# 表示有多个参数$* 表示参数分别是$1 - $9 - ${10} 表示传的参数
测试语句格式: [ 条件表达式 ]文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,-d测试文件是否为目录类型-f判断是否为一般文件-e测试文件是否存在-r测试当前用户是否有权限读取-w测试当前是否有写入权限-x测试当前用户执行权限
[ -d /root/tmp ] echo $? #如果为真 0 假为1
与&&或||非!等于==
[ $USER != root ] echo $?
整数比较运算符仅对数字进行操作-eq是否等于-ne是否不等于-gt大于-lt小于-le小于或等于-ge大于或等于
[root@linuxprobe ~]# free -m total used free shared buffers cachedMem: 1826 1244 582 9 1 413-/+ buffers/cache: 830 996Swap: 2047 0 2047[root@linuxprobe ~]# free -m | grep Mem:Mem: 1826 1244 582 9 [root@linuxprobe ~]# free -m | grep Mem: | awk '{print $4}'582[root@linuxprobe ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`[root@linuxprobe ~]# echo $FreeMem [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
字符串比较用于判断测试字符串是否为空值=比较字符串内容是否相同!=字符串内容不等于-z判断字符串内容是否为空
[ -z $String ]
流程控制语句 if for while case
下面使用单分支的if条件语句来判断/media/cdrom文件是否存在,若存在就结束条件判断和整个Shell脚本,反之则去创建这个目录:
[root@linuxprobe ~]# vim mkcdrom.sh#!/bin/bashDIR="/media/cdrom"if [ ! -e $DIR ]thenmkdir -p $DIRfi
ifthenelsefi
if 条件测试then 命令1elif 条件测试then 命令2fi
for循环条件语句for 变量名 in 取值列表do命令序列done
for 用户名 in 列表文件do创建用户并设置密码done[root@linuxprobe ~]# vim Example.sh#!/bin/bashread -p "Enter The Users Password : " PASSWDfor UNAME in `cat users.txt`doid $UNAME &> /dev/nullif [ $? -eq 0 ]thenecho "Already exists"elseuseradd $UNAME &> /dev/nullecho "$PASSWD" | passwd --stdin $UNAME &> /dev/nullif [ $? -eq 0 ]thenecho "$UNAME , Create success"elseecho "$UNAME , Create failure"fifidone
主机在线测试[root@linuxprobe ~]# vim CheckHosts.sh#!/bin/bashHLIST=$(cat ~/ipadds.txt)for IP in $HLISTdoping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ] ; thenecho "Host $IP is On-line."elseecho "Host $IP is Off-line."fidone[root@linuxprobe ~]# ./CheckHosts.shHost 192.168.10.10 is On-line.Host 192.168.10.11 is Off-line.Host 192.168.10.12 is Off-line.
while条件循环语句while条件测试操作do命令序列done
case条件测试语句case 变量值 in模式1)命令1;;模式2)命令2;;*)默认命令序列esac
read -p "请输入一个字符,并按Enter键确认:" KEYcase "$KEY" in[a-z]|[A-Z])echo "您输入的是 字母。";;[0-9])echo "您输入的是 数字。";;*)echo "您输入的是 空格、功能键或其他控制字符。"esac
计划任务服务程序定时任务只执行一次 用at#at -l 查看定时任务列表#atrm 任务号 删除[root@linuxprobe ~]# at 23:30at > systemctl restart httpdat > 此处请同时按下Ctrl+d来结束编写计划任务job 3 at Mon Apr 27 23:30:00 2015
crontab分时日月星期命令#crontab -e 编辑#crontab -l 罗列字段说明分钟取值为0~59的整数小时取值为0~23的任意整数日期取值为1~31的任意整数月份取值为1~12的任意整数星期取值为0~7的任意整数,其中0与7均为星期日命令要执行的命令或程序脚本
#假设在每周一、三、五的凌晨3点25分,都需要使用tar命令把某个网站的数据目录进行打包处理25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突
1.Vim编辑模式三种分别是命令模式、末行模式、输入模式2. $0表示脚本文件名3.if then elif then else fi4.for 变量名 in 取值列表 do .. done5.根据用户输入的不同最好执行case条件语句6.唱起计划任务使用的服务是 crontab -e 分 时 日 月 星期