linux学习之shell编程基础
Posted liangxiaochu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习之shell编程基础相关的知识,希望对你有一定的参考价值。
linux学习之shell编程基础
1 Vim文本编辑器
1.1 vim命令
用于打开或创建文档,格式为“vim [文件名]”。如果存在该文档,则打开它;若不存在,则创建一个临时输入文档。
命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作,vim命令执行后默认先到命令模式。
输入模式:正常的文本录入。
末行模式:保存或退出文档,以及设置编辑环境。
1.1.1 模式切换:
命令模式==》输入模式 a、i、o(其中a键是在光标后一位切换到输入模式;i键是在光标当前位置切换到输入模式;o键是在光标的下面创建一个空行切换到输入模式)
输入模式==》命令模式 esc键
命令模式==》末行模式 :键
末行模式==》命令模式 esc键
1.1.2 命令模式中常用命令
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的5行
yy 复制光标所在整行
5yy 复制从光标处开始的5行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
1.1.3 末行模式可用命令
: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
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
1.2 配置主机名称、网卡信息
在Linux系统中一切皆是文件,因此配置网络服务也就是编辑网卡配置文件。
Linux系统中,主机名大多保存在/etc/hostname文件中,网卡信息保存在/etc/sysconfig/network-scripts/中,RHEL7中,网卡配置文件名为ifcfg-eno16777728
ifconfig命令
用于查看网络配置信息
查看DNS:cat /etc/resolv.conf
查看GATEWAY:netstat -rn
命令行的#与$的区别:
#为管理员(root)登录,切换到$: su - username(不忽略空格)
$为普通用户登录,切换到#:su - root (然后输入root密码)
ping命令
用于测试网络能否联通,本身不会停止,需Ctrl+C停止
常用参数:
-c 规定尝试次数
-i 定义每个数据包的发送间隔
-W 定义等待超时时间
ping -c 3 -i 0.2 -W 3
重启网卡:systemctl restart network
1.3 配置Yum软件仓库
Yum配置文件在/etc/yum.repos.d/,yum配置文件后缀名必须为.repo
yum install httpd -y 检查软件仓库是否可用
mount /dev/cdrom /media/cdrom 挂载
Yum配置文件注解:
[rhel-media] Yum软件仓库唯一标识符,避免与其他仓库冲突
name=liunxprobe 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 若校验开启,需指定公钥文件地址
1 % cd /etc/yum.repos.d/
2 % vim rhel7.repo
1 % mkdir -p /media/cdrom 2 % mount /dev/cdrom /media/cdrom 3 % vim /etc/fstab 4 #输入/dev/cdrom /media/cdrom iso9660 defaults 0 0 5 % yum install httpd
2 编写shell脚本
shell脚本命令工作方式:
交互式(Interactive):用户输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令。
脚本文件名称一般加上.sh后缀
1 % vim example.sh 2 #!/bin/bash #脚本声明,用来指定SHELL解释器 3 #For Example BY liang #注释信息,用于介绍脚本功能和命令 4 pwd 5 ls -al
2.1 执行脚本:
方式一:
% bash example.sh
方式二:
1 % chomd u+x example.sh #增加执行权限
2 % ./example.sh
2.2 chomd命令
用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。格式为
chmod(选项)(参数)
权限范围的表示法如下:
u
User,即文件或目录的拥有者; g
Group,即文件或目录的所属群组; o
Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围; a
All,即全部的用户,包含拥有者,所属群组以及其他用户;
r
读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”; x
执行或切换权限,数字代号为“1”; -
不具任何权限,数字代号为“0”; s
特殊功能说明:变更文件或目录的权限。
2.3 接收用户参数
% ./example.sh one two three four five six
$0 当前Shell脚本程序名称
$# 总共有几个参数
$* 所有位置的参数值
$? 显示上一次命令的执行返回值
$N 第N个位置的参数值
2.4 判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立,若成立则返回0,否则返回其他随机数值(具体值因版本不同而不同,RHEL7为1)
条件表达式两边均要有一个空格
% [ -d /etc/fstab ]
% echo $?
#输出1
条件测试语句分为4种:文件测试语句、逻辑测试语句、整数值比较语句、字符串比较语句
2.4.1 文件测试语句
常用参数:
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
1 % [ -f /etc/fstab ]
2 % echo $?
3 #输出0
2.4.2 逻辑测试语句
与(&&)、或(||)、非(!)
与(&&) 当前面的命令执行成功后才会执行它后面的命令
% [ -e /dev/cdrom ] && echo "Exist"
或(||) 当前面的命令执行失败时才会执行它后面的命令
% [ $USER=root ] || echo "user"
非(!) 把条件测试中的判断结果取反值。
% [ ! $USER=root ] || echo "Administrator" #判断当前用户是否为管理员
逻辑命令运用
% [ ! $USER=root ] && echo "user" || echo "root" #判断当前用户是管理员还是普通用户
2.4.3 整数值比较语句
运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否小于等于
-ge 是否大于等于
2.4.4 awk命令
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
详解见https://www.cnblogs.com/quincyhu/p/5884390.html
% FreeMem=`free -m | grep Mem: | awk ‘print $4‘` #输出剩余内存量,$4第四列
判断内存可用量的值是否小于1024,小于则提示内存不足
% [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
2.4.5 字符串比较语句
运算符
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空(某个变量是否未被定义)
% [ $LANG != "en.US" ] && echo "Not en.US"
3 流程控制语句
3.1 if条件测试语句
单分支: if 条件测试操作
then 命令序列
fi
1 % vim mkcdrom.sh 2 #!/bin/bash 3 DIR="/media/cdrom" 4 if [ ! -e $DIR ] 5 then 6 mkdir -p $DIR 7 fi
双分支: if 条件测试操作
then 命令序列1
else 命令序列2
fi
1 % vim chkhost.sh 2 #!/bin/bash 3 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null #/dev/null为linux系统的黑洞文件,若只要命令结果而不想向屏幕输出可用此方式,保持屏幕清洁 4 if [ $? -eq 0 ] #上一行命令执行成功返回0,否则返回1 5 then 6 echo "Host $1 is On-line." 7 else 8 echo "Host $1 is Off-line." 9 fi
多分支: if 条件测试操作1
then 命令序列1
elif 条件测试操作2(可加多个elif)
then 命令序列2
else 命令序列3
fi
1 % 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 elif [ $GRADE -le 69 ] : then 9 echo "$GRADE is Fail" 10 else 11 echo "Your score is illegal!" 12 fi
read命令
用来读取用户输入信息,能够把接收到的用户输入信息赋值给后面的指定变量,-p参数用于向用户显示一定的提示信息。
3.2 for条件循环语句
for条件循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,最适合用此语句。
for 变量名 in 取值列表
do
命令序列
done
批量创建用户脚本:
1 % vim users.txt 2 andy 3 barry 4 carl 5 duke 6 eric 7 george 8 9 %vim Example.sh 10 #!/bin/bash 11 read -p "Enter The Users Password: " PASSWD 12 for UNAME in `cat users.txt` 13 do 14 id $UNAME &> /dev/null 15 if [ $? -eq 0 ] 16 then 17 echo "Already exists" 18 else 19 useradd $UNAME &> /dev/null 20 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null 21 if [ $? -eq 0 ] 22 then 23 echo "$UNAME , Create success" 24 else 25 echo "$UNAME , Create failture" 26 fi 27 fi 28 done
id命令
用于查看用户信息,执行成功说明用户存在,格式“id [-gGnru][--help][--version][用户名称]”
useradd命令
用于创建新用户,格式“useradd(选项)(参数)”
passwd命令
用于设置/修改用户密码,格式“passwd [options] [LOGIN]”
3.3 while条件循环语句
while语句通过判断条件测试的真假来决定是否继续执行命令。
while 条件测试操作
do
命令序列
done
expr命令
expr命令是一款表达式计算工具,使用它完成表达式的求值操作。格式“expr(选项)(参数)”
常用运算符
- 加法运算:+
- 减法运算:-
- 乘法运算:*
- 除法运算:/
- 求摸(取余)运算:%
exit命令
exit命令同于退出shell,并返回给定值。在shell脚本中可以终止当前脚本执行。执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出。状态值0代表执行成功,其他值代表执行失败。格式“exit(参数)”
let命令
let命令是bash中用于计算的工具,提供常用运算符还提供了方幂**
运算符。在变量的房屋计算中不需要加上$
来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。格式为“let arg [arg ...] #arg代表运算式”
自加操作let no++
自减操作let no--
简写形式let no+=10
,let no-=20
,分别等同于let no=no+10,
let no=no-20
例:猜商品价格
1 % vim Guess.sh 2 #!/bin/bash 3 PRICE=$(expr $RANDOM % 1000) 4 TIMES=0 5 echo "商品实际价格为0-999之间,猜猜看是多少?" 6 while true 7 do 8 read -p “请输入您猜测的价格:” INT 9 let TIMES++ 10 if [ $INT -eq $PRICE] ; then 11 echo "恭喜您答对了,实际价格是$PRICE" 12 echo "您总共猜了$TIMES次" 13 exit 0 14 elif [ $INT -gt $PRICE ] ; then 15 echo "太高了" 16 else 17 echo “太低了” 18 fi 19 done
3.4 case条件测试语句
case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
*)
默认命令序列
esac
1 % vim Checkkeys.sh 2 #!/bin/bash 3 read -p "请输入一个字符,并按Enter确认:" KEY 4 case “$KEY” in 5 [a-z]|[A-Z]) 6 echo "您输入的是字母。" 7 ;; 8 [0-9]) 9 echo "您输入的是数字。" 10 ;; 11 *) 12 echo "您输入的是空格、功能键或其他控制字符。" 13 esac
4 计划任务服务程序
计划任务分为一次性计划任务与长期性计划任务。
4.1 一次性计划任务
at命令
实现一次性计划任务,格式“at [时间]”,参数-l用于查看任务
atrm命令
删除一次性计划任务,格式“atrm [任务序号]”
% echo "systemctl restart httpd" | at 23:30 #时间只能到分
4.2 长期性计划任务
crond服务
crontab -e 创建/编辑计划任务
crontab -l 查看当前计划任务
crontab -r 删除某条计划任务
crontab -u (需root权限)编辑他人的计划任务
参数设置顺序:分、时、日、月、星期 命令,如果有些字段没有设置需用星号(*)占位。计划任务也可加注释信息,计划任务中的“分”字段必须有数值,绝对不能为空或者是星号(*),而“日”和“星期”字段不能同时使用,否则就会发生冲突。
例:周一、三、五凌晨3点25,把网站数据进行备份
% crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
除了用逗号(,)分别表示多个时间段,还可用减号(-)来表示一段连续的时间周期,以及用除号(/)表示执行任务的时间间隔(*/2表示每2分钟执行一次任务),如果在crond服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写。
whereis命令
用于查询命令的绝对路径。
以上是关于linux学习之shell编程基础的主要内容,如果未能解决你的问题,请参考以下文章