Shell学习笔记1

一、第一个shell 程序

mkdir 创建文件夹

cd 切换目录

chmod +x 文件名 给该文件“可执行”的权限

./文件名 执行文件 (需要为文件赋予可执行的权限)

sh/bash 文件名 (不需要文件有可执行的权限)

source 文件名 (不需要文件有可执行的权限,但不会启动子进程)

#!/bin/bash 声明解释器

# 注释内容

 

二、shell语法

1、变量

定义变量:变量名=变量值

取消变量:ueset 变量名

查看变量:$变量名 / ${变量名}

注意事项:

  • =两边不能有空格
  • 如果变量名已经存在则覆盖之前的变量值
  • 变量名由字母/数字/下划线组成,但不能以数字开头

 

2、变量类型

1)环境变量(变量名通常大写,有操作系统维护)

存储在/etc/profile或~/.bash_profile

命令env可以列出所有的环境变量

常见的环境变量有:PATH、PWD、USER、UID、HOME、SHELL

2)位置变量(bash内置变量,存储脚本执行时的参数)

 使用$n表示,n为数字序列号

$1、$2、...  、${10}、${11}、... 

 

3)预定义变量(bash内置变量,可以调用但是不能赋值或修改)

用来保存脚本程序的执行信息

$0 当前所在的进程或脚本名

$$ 当前运行进程的PID号

$? 命令执行后的返回状态,0表示正常,1或者其他值表示异常

$# 所在位置变量的个数

$* 所在位置变量的值

4)自定义变量(用户自主设置)

 

3、变量的扩展应用

1)多种引号的区别

双引号"" 允许扩展,以$引用其他变量

单引号'' 禁用扩展

反引号`` 将命令的执行输出作为变量值,$()与反引号等效

 

2)read命令定义变量(从键盘读入变量值完成赋值)

read  [-p "提示信息"]  变量名

-p可选,-t可指定超时秒数,-s设置是否在终端显示输入的内容

 

3)全局or局部

局部变量:新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用

全局变量:全局变量在当前Shell及子Shell环境中均有效

 

4、Shell中的运算

1)整数运算

运算符:+、-、*、/、%

$[] 或 $(())  

  • $[整数1 运算符 整数2 ...]
  • 计算结果替换表达式本身,可结合echo命令输出

简写格式和C++一样

 

2)小数运算

Bash内机制仅支持整数运算,不支持小数运算

我们可以通过计算机软件bc实现小数运算

  • 如果没有该软件则需要使用yum安装
  • bc支持交互式和非交互式两种方式计算,scale=n可以约束小数位

 

3)小数的比较

bc支持的比较操作符:>、>=、<、<=、==、!=

表达式成立则返回1,否则返回0

 

5、条件+循环

1)条件测试

test测试操作,语法格式:

  • test 选项 参数
  • [选项 参数]

 

字符串比较,基本语法:(注意空格位置

  • 是否为空[ -z 字符串 ]
  • 等于[ 字符串1 == 字符串2 ]
  • 不等于[ 字符串1 != 字符串2 ]

 

 

整数值比较:

  • [ 整数值1 操作符 整数值2 ]
操作符 含义
-eq 等于(Equal)
-ne 不等于(Not Equal)
-ge 大于或等于(Greater or Equal)
-le 小于或等于(Less or Equal)
-gt 大于(Greater Than)
-lt 小于(Less Than)
 

文件状态测试:

  • [ 操作符 文件或目录]

 

操作符 含义
-e 判断对象是否存在(Exit),若存在则结果为真
-d 判断对象是否为目录(Directory),是则为真
-f 判断对象是否为一般文件(File),是则为真
-r 判断对象是否有可读权限(read),是则为真
-w 判断对象是否有可写权限(write),是则为真
-x 判断对象是否具有可执行权限(excute),是则为真

 

使用控制操作符组合多个命令

  • 计算机按顺序执行命令,多个命令之间没有逻辑关系
  • &&计算机按顺序执行命令,仅当前一个命令执行成功时,计算机才执行后面的命令
  • ||前面的命令执行成功,后面的命令不再执行;前面的命令执行失败,才执行后面的命令

 

2)if语句

if的单分支判断

  • if 条件测试

  then 命令序列

        if

 

  • if 条件测试;then

  命令序列

       fi

 

if双分支判断语法

  • if 条件测试

          then

    命令序列1

    else

    命令序列2

    fi

 

  • if 条件测试;then

    命令序列1

     else

    命令序列2

          fi     

 

if多分支判断语法

  • if 条件测试1;then

    命令序列1

  elif 条件测试2;then

    命令序列2

  ... ...

  else

    命令序列n

  fi

 

3)for循环

语法格式

  • for 变量 in 值列表

  do

    命令序列

  done

  • for((初值;条件;步长))

  do

    命令序列

  done

 

4)while 循环

语法格式

  • while 条件测试

  do

    命令序列

  done

 

5)case语句

语法格式

  • case 变量 in

  模式1)

    命令序列1;;

  模式2)

    命令序列2;;

  ... ...

  *)

    默认命令序列

  esac

 

6、数组

 

7、shell函数

函数定义

  • function 函数名{

    命令序列

    ... ...

  }

  • 函数名(){

    命令序列

    ... ...

  }

调用函数

  • 函数名

函数传值(传递的值作为函数的“位置参数”)

  • 函数名 值1 值2 ... ...

 

8、中断和退出

  • continue 可以结束单词循环
  • break 可以结束循环体
  • exit 可以退出脚本

 

9、字符串的处理与变量初始化

子串截取

  • ${变量:起始位置:长度}

 

子串替换

  • 替换一个结果 ${变量/旧字串/新字串}
  • 替换全部结果 ${变量//旧字串/新字串}

替换后只是显示出来,但是phone的值没有改变

 

字串掐头

  • 从左向右,最短匹配删除  ${变量#关键字}
  • 从左向右,最长匹配删除  ${变量##关键字}

同样,对变量掐头不会改变变量原有的值

 

字串去尾

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

同样,对变量去尾不会改变变量原有的值

 

10、变量初始化

语法格式 ${变量:-关键词}

变量有值,则返回该变量的值

变量无值,则返回初始值

 

11、随机

子串截取生产密码

 

使用命令生成随机密码

  • uuidgen
  • openssl

 

使用随机设备文件(/dev/random、/dev/urandom)

tr命令可以对数据进行替换、删除等操作

  • -c 取反
  • -d 删除

tr -d 'a-z' 删除字串中的a-z的部分

tr -cd 'a-z' 删除字串中不是'a-z'的部分

 

三、正则表达式

1、基本正则

正则表达式(Regular Expression):

  • 描述一个字符集合的表达方式
  • 模糊匹配
正则符号 描述
abc 匹配abc
^ 匹配开头
$ 匹配结尾
[集合] 匹配集合中的任意单个字符
[^集合] 对集合取反
. 匹配任意单个字符
* 匹配前一个字符任意次(包含0次)
.* 匹配任意
\{n,m\} 匹配前一个字符n到m次
\{n,\} 匹配前一个字符至少n次
\{n\} 匹配前一个字符n次

 

 

2、扩展正则

正则符号 描述
+ 匹配前面的字符至少1次
匹配前面的字符0或1次
() 组合与保留
| 或者
{n,m} 匹配前面的字符n到m次
{n,} 匹配前面的字符至少n次
{n} 匹配前面的字符n次

grep默认不支持扩展正则,使用时需添加-E的选项

 

3、Perl兼容的正则符号

正则符号 描述
\b 匹配单词边界
\w 匹配字符数字下划线
\W 和\w相反
\s 匹配空白
\d 匹配数字
\d+ 匹配多个数字
\D 匹配非数字

grep默认不支持Perl正则,使用时需添加-P的选项

 

grep语法格式

  • grep [选项] 匹配模式 [文件]...

常用选项:

  • -i 忽略大小写
  • -v 取反匹配
  • -w 匹配单词
  • -q 静默匹配,不将结果显示在屏幕

 

四、sed基础

1、什么是sed

Stream Editor:流式编辑器

  • 非交互式
  • 逐行处理
  • 可以对文本进行增、删、改、查等操作

语法格式:

  • sed [选项] '[定位符]指令' 文件名
  • 命令 | sed [选项] '[定位符]指令'

常用命令选项:

  • -n 屏蔽默认输出
  • -i 直接修改源文件
  • -r 支持扩展正则

 

 

2、数据定位

行号定位

 

正则定位:用正则匹配需要的数据,然后再编辑对应的内容

 

3、使用sed修改配置

 

常用sed指令:

 

  • p 打印行

 

 

 

 

  • d 删除行(不使用-i选项,源文件不会被修改)

 

 

  • c 替换行(不使用-i选项,源文件不会被修改)

 

  • s 替换关键词(c以行为单位替换,s以关键词为单位替换且替换符'/'可以用任意符号代替,)

 

  • = 打印行号

 

posted @ 2022-05-14 16:28  super_sweet  阅读(77)  评论(0编辑  收藏  举报