shell脚本 | 重定向 | 变量

147 阅读4分钟

1、脚本相关命令

1.1 tr

tr 具有 替换、压缩、删除的功能,文本处理工具,后面跟正则表达式,处理文本内容或者字符串

选项含义
-d删除
-s压缩
-c补集
 tr 1  a    把1替换成a
 tr -d 1    遇到1就删掉
 tr -d %    删除%
 tr -s 1    把连续的多个1 压缩为单个1

示例:

 [root@localhost ~]#  vim abc
 [root@localhost ~]#  cat abc
 a%
 b%
 c%
 dd$
 [root@localhost ~]#  cat abc |tr -d %     //删除%
 a
 b
 c
 dd$
 ​

1.2 seq 分隔符

shell中默认的换行符是回车。

选项含义
-s指定分隔符

示例:

 [root@localhost ~]#  seq 100    //打印 从1-100
 1
 2
 3
 4
 ...
 100    
 ​
 [root@localhost ~]#  seq 10 |cat -A    //cat选项只有大A(查看隐藏字符),没有小a
 1$
 2$
 3$
 4$
 5$
 6$
 7$
 8$
 9$
 10$
 ​
 [root@localhost ~]#  seq -s + 5     //打印1-5,指定分隔符是+
 1+2+3+4+5
 [root@localhost ~]#  seq -s - 5
 1-2-3-4-5
 [root@localhost ~]#  seq -s + 5 |bc    //计算1-5的和,bc是计算器,计算总和
 15

小拓展:access.log是日志文件,访问日志

1.3 cut 切列

选项含义
-d指定分隔符
-f指定列
-c取字符

-f 格式:

  • #,#[,#]:离散的多个字段,例如 1,3,6
  • #-#:连续的多个字段, 例如 1-6
  • 混合使用:1-3,7

示例:

 [root@localhost ~]#  cut -d: -f1 /etc/passwd      //以:为分隔符,并且只取第1列。
 ​
 [root@localhost ~]#  cut -d: -f1,3 /etc/passwd   //取第1列和第3列

cut命令弊端: 不能将连续的字符当作分隔符

1.4 sort 排序

默认不以数字大小排序,sotr默认先以a-z,再以0-9排序

选项含义
-k指定列
-n按照数字大小排序
-r倒序
-t指定分隔符
-R随机排序
-f忽略大小写

1.5 uniq 去重

只能将连续的重复部分去掉

选项含义
-c显示出现的次数
-d仅显示重复过的行
-u仅显示不曾重复的行

2、shell脚本

2.1 shell脚本构成

  1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect

  2. 注释信息:以#开头的语句表示为注释信息 # 注 释

  3. 可执行语句:比如echo命令用于输出“ ”之间的字符串

    • 直接使用:bash + 脚本,直接使用shell程序来读取脚本中的命令,不需要执行权限

    • 使用路径执行,需要权限

      • 相对路径
      • 绝对路径
    • source 或者. 不需要权限。但不推荐该种方法。

// 总结:前两种方法,执行中不会影响当前环境中bash设置,会开启一个新的bash脚本;但是第三种,会影响当前bash 环境中的配置。

2.2 脚本执行方式

  1. 顺序执行:程序按从上到下顺序执行 。命令出错不会影响接下来的命令,会继续执行,注意这样有风险,如何规避:

使用此命令:set -e 一旦出错,脚本立即停止执行。

检查命令错误和语法错误:

  • bash -n
  • bash -x
  1. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  2. 循环执行:程序执行过程中需要重复执行多次某段语句
  • 已知次数
  • 已知条件

// 不然会成为死循环

安装本地yum仓库的脚本:

3、重定向

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置。

  • 标准输入:从该设备接收用户输入的数据
  • 标准(正确)输出:通过该设备向用户输出数据
  • 标准错误输出:通过该设备报告执行出错信息
类型设备文件文件描述编号
标准输入/dev/stdin0
标准输出/dev/stdout1,可以省略
标准错误输出/dev/stderr2

// 上面设备文件,相当于做了个软链接。

3.1 重定向输入

操作符含义
<从指定的文件读取数据,而不是从键盘输入
<<
 [root@localhost ~]#  vim test1.txt
 你好,世界!
 [root@localhost ~]#  cat < test1.txt
 你好,世界!   

3.2 重定向输出

3.2.1 正确输出和错误输出

  • 1是正确,1可以省略
  • 2是错误,2不可以省略
操作符含义
1>覆盖
1>>追加(追加到尾部,不会覆盖原有内容)
2>将错误信息保存到指定文件(覆盖原有内容)
2>>将错误信息追加到指定文件

3.2.2 混合输出

操作符含义
&>将正确和错误输出,都保存到同一个文件中。 &可以放到前面,也可以放后面,效果一样。

4、变量

变量前加$

注意:脚本中,命令尽量不要写死,不然修改会很麻烦,设置变量是为了方便我们修改脚本。

哪些不能设置成变量:

  • 1、2是常量,不要设置
  • 系统保留的占位符,比如if while

4.1 变量分类

  • 环境变量
  • 预定义变量
  • 位置变量
  • 只读变量

4.2 定义变量

shell 数据类型都是字符串

变量是临时性的,想要永久使用,可以写到 .bashrc或者/etc/profile,(一般用/etc/profile,是环境变量)

4.3 变量的四大符号

{ } :确定变量的起始结束范围,建议只要有变量就加
“ ” :弱引用,可以识别变量 ,聪明的
‘ ’ :强引用,不识别变量, 不聪明
``  :反撇号,调用命令执行结果,效果等同于$()