Linux基础9--shell入门

Shell概述

  • shell连接了用户和Linux内核,它可以解释用户输入的命令传递给内核,让用户可以更加方便的使用Linux系统

  • shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序 

  • shell具备编程的能力,shell也是一种语言,C,C++,java,Python,Go等

  • 语言分为编译型语言,C,C++,Go,需要提前编译,编译语言都有编译器

  • 解释型语言,shell,Python,php,不需要提前编译,一边执行,一边解释,每种解释型语言都有解释器

  • shell语言支持大部分编程语言都具备的功能:if判断,for循环,变量,数组,函数,加减乘除,逻辑运算

规范shell脚本组成

#!/bin/bash(环境声明)

#注释信息

可执行代码...

如何写好一个shell脚本

  • 明确任务需求

  • 按需求整理好每一个步骤,先做什么,后做什么

  • 运行脚本,并根据运行结果排除错误

  • 优化脚本并达到最终效果

脚本的执行方式

 方法一:赋予脚本执行权限后,可用绝对路径或当前路径执行

 方法二:调用解释器执行脚本文件

常用特殊符号补充

 " " #双引号,引用整体

 ‘ ’ #单引号,引用整体并取消所有特殊字符含义

 $[] #四则运算

 $() #将命令的输出结果作为参数

 · · #反撇,将命令的输出结果作为参数

变量

  以固定的名称存放可能变化的值,提高脚本的灵活度来适应多变的环境

  定义变量:变量名=变量值(等号两边不要有空格)

  取消变量:unset 变量名

  定义变量注意事项:

  变量名由字母、数字、下划线组成,区分大小写,不能以数字开头,不要使用命令和特殊符号

  若指定的变量名已存在,相当于为此变量重新赋值

read标准输入取值

read读取用户在键盘上输入的内容,并把内容放在变量里,可以降低脚本的使用难度

命令格式:read -p "提示信息" 变量名

变量种类

  环境变量:变量名一般都大写,用来设置用户/系统变量

  位置变量:bash内置,存储执行脚本时提供的命令参数

  预定义变量:bash内置,可直接调用的特殊值,不能直接修改

  自定义变量:用户自定义

  env命令查看系统所有环境变量

  set命令查看系统所有变量,包括用户自定义变量

获取变量值:echo $SHELL

位置变量:

$0 #脚本名称

$1 #第一个参数

$n #第n个参数

预定义变量

$0 #脚本本身

$* #显示所有参数内容

$# #显示有多少个参数

$? #显示上一条命令的执行结果(0正确,非0错误)

$$ #显示脚本进程号(PID)

判断文件状态

-e #判断文档(文件/目录)是否存在,存在为真

-d #判断目录是否存在,存在为真

-f #判断文件是否存在,存在为真

-r #可读为真

-w #可写为真

-x #可执行为真

格式:[ -e /etc/ ]  #两边都要留空格

整数比较

-gt #大于

-ge #大于等于

-eq #等于

-lt #小于

-le #小于等于

-ne #不等于

字符串比较

== #相等

!= #不相等

常用数值运算方式

$[] #四则运算: echo $[10+5]

$(()) #数值运算工具:echo $((10+5))

expr #数值运算工具:echo `expr 2 + 3`每一部分都要有空格

let #数值运算工具:需要将运算的结果赋予一个变量存储

[root@localhost ~]# let a=10+5
[root@localhost ~]# echo $a

let简写:           let i++          let i--             let i+=2

let完整表达式:let i=i+1        leti=i-1          let i=i+2

字符串判断:

-z #字符串的值为空为真

-n #字符串的值非空为真(相当于 ! -z)

#判断时每一部分要有空格
[root@localhost ~]# [ -z /etc/passwd ]

条件判断结构

当条件满足时执行什么操作,当条件不满足时执行什么操作

&& #逻辑与(并且)

|| #逻辑或(或者)

; #条件之间没有逻辑关系

A && B  #当A命令执行成功后才会执行B,如果A执行失败则B不执行

A || B  #当A命令执行失败后才会执行B,如果A执行成功则B不执行

A ;  B  #执行A命令后执行B,两者没有逻辑关系

if条件判断结构

if单分支语句,只能判断对,不能判断错

#第一种语法结构
if [条件判断];then
条件成立时,执行的命令
fi

#第二种语法结构
if [条件判断]
then
条件成立时,执行的命令
fi

if双分支语句

if [条件判断];then

  条件成立时,执行命令a

 else

  条件不成立时,执行命令b

fi

if多分支语句

if [条件判断1];then
  条件1成立时,执行命令a
elif [条件判断2];then
  条件2成立时,执行命令b
elif [条件判断3];then
  条件3成立时,执行命令c
...省略更多条件
else
  所有条件都不成立时,执行命令d
fi

case条件判断结构

case从变量中取值,如果变量中的值与预设的值不匹配,则执行对应的命令

#case语法结构

case #变量名 in

值1)

  执行的命令;; #如果变量中的值等于值1执行的命令

值2)

  执行的命令;; #如果变量中的值等于值2执行的命令

...省略其他分支
*)
  执行的命令zz;; #如果变量中的值都不是以上的值,则执行的命令

esac

for循环

for循环处理,根据变量的取值,重复执行xx命令

#for循环语法结构

for 变量名 in 值1 值2 值3 ...

do

  执行的命令

done

#测试企业的服务器联动性

#!/bin/bash

for i in `seq 254`

do

  ping -c2 -i0.1 -W1 192.168.0.$i &> /dev/null

  #-c选项控制ping测试的次数

  #-i选项,控制多次ping测试的间隔时间,默认为1秒

  #-W选项,可以控制超时时间

  if [ $? -eq 0 ];then

    echo "192.168.0.$i UP" >> up.txt

  else

    echo "192.168.0.$i" DOWN >> down.txt

  fi

done

while循环

死循环,只要条件成立就重复执行命令

#while循环语法结构

while 条件判断

do

  执行的命令

done

#使用while循环编写一个测试整个网段IP地址的联通性脚本
#!/bin/bash
i=1 #定义一个变量
while [ $i -le 254 ] #循环判断变量的值小于等于254
do
  IP="192.168.0.$i" #定义一个变量
  ping -c2 -i0.1 -W1 $IP &> /dev/null #输出结果不要
  if [ $? -eq 0 ];then #判断上一条命令的结果,如果上一条命令的结果等于0
    echo "$IP UP" #输出主机UP
  else
    echo "$IP DOWN" #输出主机DOWN
fi
let i++ #对变量的值自加1
done

shell函数

在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数

函数可以使脚本中的代码更加简洁,增强易读性,提高脚本的执行效率

#函数定义格式1

function 函数名 {

  执行的命令1

  执行的命令2

  ...

}

#函数定义格式2

函数名() {

  执行的命令1

  执行的命令2

  ...

}

脚本中断及退出

break #结束整个循环

continue #结束本次循环,进入下一次循环

exit #退出脚本

字符串截取

常用方法:${变量名:起始位置:长度}

${}截取字符串时,起始位置是从0开始的

字符串替换

命令:${变量名/xx/yy} #只替换第一个匹配的结果

${变量名//xx/yy} #替换全部匹配的结果

字符串掐头去尾

从左向右,最短匹配删除:${变量名#*关键词}

从左向右,最长匹配删除:${变量名##*关键词}

从右向左,最短匹配删除:${变量名%关键词*}

从右向左,最长匹配删除:${变量名%%关键词*}

#字符串去尾方式批量修改文件扩展名

#!/bin/bash

for i in `ls *.doc`

do

  mv $i ${i%doc}txt

done

shell数组

定义数组方式1:数组名=(值1 值2 值3 ... 值n)

#获取数组内所有值:echo ${数组名[@]}

定义数组方式2:数组名[下标]=值

正则表达式

正则表达式使用一串符号描述有共同属性的数据

 

基本正则符号 描述 示例
^ 匹配行首 grep "^root" /etc/passwd
$ 匹配行尾 grep "bash$" /etc/passwd
[] 集合,匹配集合中的任意单个字符 grep "ro[acto]" /etc/passwd
[^] 对集合取反 grep "ro[^ab]" /etc/passwd
. 匹配任意单个字符 grep "roo." /etc/passwd
* 匹配前一个字符出现的任意次数(不允许单独使用) grep "w.*" /etc/passwd
{n,m} 匹配前一个字符n到m次(首先匹配m次) grep "a\{1,\}" /etc/passwd
{n} 匹配前一个字符n次 grep "o\{2\}" /etc/passwd
扩展正则符号 描述 示例
+ 最少匹配一次(前一个字符出现的次数) egrep "a+" 1.txt
? 最多匹配一次(前一个字符出现的次数) egrep "a?b" 1.txt
{n,m} 匹配n到m次(前一个字符出现的次数) egrep "a{2,4}b" 1.txt
() 组合为整体,保留 egrep (ab) 1.txt
| 或者 egrep "ab|abc|aab" 1.txt
\b 单词边界 egrep "\bthe\b" 1.txt

 

posted @   胖丿虎  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示