shell脚本
sed和awk命令
shell脚本概述:
我们所输入的命令计算机是不识别的,这时就需要一种程序帮助我们进行翻译,变成计算机所识别的二进制程序,同时又将计算机所执行的结果翻译给我们,这个就是shell
linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种使用不同的shell时期内部指令命令提示方式方面会存在一些区别,可以通过/etc/shells文件查看
[root@zq ~]# cat /etc/shells /bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin/bin/tcsh/bin/csh
/bin/bash是大多数Linux中默认的shell解释器,之后的所有脚本编写都是bash脚本
我们可以添加别的shells 比如zsh
[root@zq ~]# rpm -ivh /mnt/Packages/zsh-5.0.2-14.el7.x86_64.rpm 警告:/mnt/Packages/zsh-5.0.2-14.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY准备中... ################################# [100%]正在升级/安装... 1:zsh-5.0.2-14.el7 ################################# [100%][root@zq ~]# cat /etc/shells /bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin/bin/tcsh/bin/csh/bin/zsh 多了一个zsh[root@zq ~]# zsh 运行zshell[root@zq]~# cd /etc/sysctl.d 显示绝对路径[root@zq]/etc/sysctl.d# exit 退出回到bash
编写一个shell脚本
以.sh后缀名
通常linux不以后缀名区分文件,为了方便记忆这里我们就以.sh结尾
vim first.sh
#!/bin/bash 指定通过哪种shell执行# This is my first shell-script 描述你写的shell功能 注释不生效mkdir /root/shell 创建 root下 shell目录ifconfig 查看 总结一下: 当写一个比较大的脚本时,如果没有一个好的注释,其他人很难明白其中的意思,执行用的时候有困难
写完之后要给这个脚本加权限
chmod u+x first.sh
./first.sh 执行
[root@zq ~]# ll /root/first.sh -rw-r--r-- 1 root root 71 5月 8 21:26 /root/first.sh[root@zq ~]# chmod u+x first.sh [root@zq ~]# ./first.sh eno16777736: flags=4099mtu 1500 inet 192.168.1.63 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fedf:de30 prefixlen 64 scopeid 0x20 ether 00:0c:29:df:de:30 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 304 (304.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 304 (304.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099 mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:6e:7f:7d txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@zq ~]# ls /root/anaconda-ks.cfg first.sh initial-setup-ks.cfg shell
执行脚本的不同方式
第一种使用绝对路径执行
第二种使用相对路径执行,eg:./方式
第三种使用sh命令执行 格式:sh/路径/脚本文件名.sh 不需要执行权限
第四种 bash命令来执行 格式:同上
变量:
定义:可以存放一个可变的值的空间
常见的shell变量:自定义变量,环境变量,位置变量,预定义变量
一般使用echo 输出变量 变量名的格式=$变量名
自定义变量:
. 用户根据自己的环境自己定义变量
. bash中比较简单的变量,不用进行提前声明,而是直接指定变量名称并赋给初始值
. 定义变量的基本格式为变量名=变量值等号两边不允许出现空格
. 变量名称只能以字母和下划线开头名称中不能包含特殊字符
eg:定义一个变量名为zq值为5 的变量和Zq值为4
[root@zq ~]# zq=5[root@zq ~]# echo $zq5[root@zq ~]# Zq=4[root@zq ~]# echo $Zq4
直接在命令行定义,以上就是定义一个变量并赋值,通过echo进行输出变量,$是引用变量的特殊字符(必须使用¥符号)
echo 和调用的变量之间必须用空格隔开
两个可以一起调用
[root@zq ~]# echo $zq $Zq5 4
当变量名和后面的字符容易混淆的时候应该用{}将变量名括起来
[root@zq ~]# echo $zqsystem 不可以[root@zq ~]# echo {$zq}system 不正确 大括号的位置不对{ 5}system[root@zq ~]# echo ${zq}system 正确,大括号必须把变量名单独括起来5system
read命令
除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)
执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
比如我们同时定义两个变量操作如下
[root@zq ~]# read zz qq56 用户输入变量值 一定要隔开[root@zq ~]# echo $zz $qq56[root@zq ~]# echo $zz56[root@zq ~]# echo $qq 从这就可以看出问题[root@zq ~]# read zz qq 5 6[root@zq ~]# echo $zz $qq5 6[root@zq ~]# echo $zz5[root@zq ~]# echo $qq6 这是正确的显示效果
为了交互式更加的形象,提高易用性,加上-p选项来设置提示信息
[root@zq ~]# read -p "input your passwd:" passwdinput your passwd:123456[root@zq ~]# echo $passwd123456
数值变量的运算:(这不是shell的强项)
shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)
在shell环境中,只能进行比较简单的整数运算
运算符与变量之间必须有一个空格位,整数的运算主要是通过内部命令expr 命令进行运算
格式: 变量1 运算符 变量2
+-*/ 取余%
[root@zq ~]# a=10[root@zq ~]# b=20[root@zq ~]# expr $a + $b30[root@zq ~]# expr $a+$b 没有空格显示的结果10+20[root@zq ~]# expr $a+ $b expr: 语法错误[root@zq ~]# expr $a + $b30[root@zq ~]# expr $a +$bexpr: 语法错误[root@zq ~]# expr $a * $bexpr: 语法错误[root@zq ~]# expr $a \* $b shell里面的乘法运算 我也是醉了(学python的悠着点儿这块儿)200[root@zq ~]# expr $a / $b 非整除0显示0[root@zq ~]# expr $a % $b10
若要将运算结果赋值给其他变量可以这么做
[root@zq ~]# ab=$(expr $a + $b)[root@zq ~]# echo $ab30