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+=10let 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编程基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习之Shell脚本初识

shell学习之编程基础知识

shell学习之正则表达式基础篇

bash的配置文件(linux学习之八)

嵌入式linux学习之Shell操作

嵌入式linux学习之Shell操作