首页 > 代码库 > Linux shell

Linux shell

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=4099<UP,BROADCAST,MULTICAST>  mtu 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<link>
        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 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        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 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  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 $zq
5
[root@zq ~]# Zq=4
[root@zq ~]# echo $Zq
4

直接在命令行定义,以上就是定义一个变量并赋值,通过echo进行输出变量,$是引用变量的特殊字符(必须使用¥符号)

echo 和调用的变量之间必须用空格隔开

两个可以一起调用

[root@zq ~]# echo $zq $Zq
5 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 qq
56                          用户输入变量值   一定要隔开
[root@zq ~]# echo $zz $qq
56
[root@zq ~]# echo $zz
56
[root@zq ~]# echo $qq
                          从这就可以看出问题
[root@zq ~]# read zz qq 
5 6
[root@zq ~]# echo $zz $qq
5 6
[root@zq ~]# echo $zz
5
[root@zq ~]# echo $qq
6                                               这是正确的显示效果

为了交互式更加的形象,提高易用性,加上-p选项来设置提示信息

[root@zq ~]# read -p "input your passwd:" passwd
input your passwd:123456
[root@zq ~]# echo $passwd
123456

数值变量的运算:(这不是shell的强项)

shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)

在shell环境中,只能进行比较简单的整数运算

运算符与变量之间必须有一个空格位,整数的运算主要是通过内部命令expr 命令进行运算

格式:   变量1 运算符 变量2

+-*/   取余%

[root@zq ~]# a=10
[root@zq ~]# b=20
[root@zq ~]# expr $a + $b
30
[root@zq ~]# expr $a+$b  没有空格显示的结果
10+20
[root@zq ~]# expr $a+ $b  
expr: 语法错误
[root@zq ~]# expr $a + $b
30
[root@zq ~]# expr $a +$b
expr: 语法错误
[root@zq ~]# expr $a * $b
expr: 语法错误
[root@zq ~]# expr $a \* $b  shell里面的乘法运算 我也是醉了(学python的悠着点儿这块儿)
200
[root@zq ~]# expr $a / $b   非整除0显示
0
[root@zq ~]# expr $a % $b
10

若要将运算结果赋值给其他变量可以这么做

[root@zq ~]# ab=$(expr $a + $b)
[root@zq ~]# echo $ab
30

 

Linux shell