zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    正则表达式--hdu2206ip匹配
    win7查看隐藏分区
    我购买byd的几点逻辑
    html5笔记
    机器学习
    Popular Cows
    武大OJ 574. K-th smallest
    武大OJ 622. Symmetrical
    [HAOI2011]防线修建
    1185: [HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/zq6041/p/6828250.html
Copyright © 2011-2022 走看看