• linux学习18 shell脚本基础-bash变量和逻辑运行


    一、回顾

      1、用户管理,权限管理,install,mktemp

      2、用户管理:

      3、权限管理:

        mode,ownership

        mode:

          user

          group

          other

          r

          w

          x

      4、命令:install,mktemp

    二、bash特性及bash脚本编程初步

      1、终端:附着在终端的接口程序

        GUI:KDE,GNome,Xfce

        CLI:/etc/shells

      2、bash的特性:

        a、命令行展开:~,{}

        b、命令别名:alias,unalias

        c、命令历史:history

        d、文件名通配符

        e、快捷键:Ctrl + a,e,u,k,l

        f、命令补全:$PATH

        g、路径补全:

      3、bash特性之命令hash

        a、缓存此前命令查找的结果,即命令hash。注意他只会缓存外部命令,内部命令因为是shell自带的所以不会缓存,包括hash自己也是。

    [root@localhost ~]# hash 
    hash: hash table empty
    [root@localhost ~]# ls /root/
    anaconda-ks.cfg  hello  inittab
    [root@localhost ~]# cat /etc/fstab > /dev/null 
    [root@localhost ~]# echo "wohaoshuai" > /dev/null 
    [root@localhost ~]# hash 
    hits    command
       1    /usr/bin/cat
       1    /usr/bin/ls

        b、选项

          -d:忘记每一个已经记住的命令的位置

          -r:忘记所有记住的位置

    [root@localhost ~]# hash 
    hits    command
       1    /usr/bin/cat
       1    /usr/bin/ls
    [root@localhost ~]# hash -d cat 
    [root@localhost ~]# hash 
    hits    command
       1    /usr/bin/ls
    [root@localhost ~]# hash -r
    [root@localhost ~]# hash 
    hash: hash table empty

        c、缓存对应的存储格式为:key-value

          key:搜索键

          value:值

    三、bash的特性之:变量

      1、程序:指令+数据组成

        指令:由程序文件提供

        数据:IO设备,文件,管道,变量

        程序:算法+数据结构

      2、变量名+指向的内存空间

      3、变量赋值:name=value

      4、变量类型:存储格式、表示数据范围、参与的运算

        123,34=12334

      5、编程语言:

        强类型变量编程语言:比如C语言,python

        弱类型变量编程语言:

          比如bash,把所有变量统统视作字符型。bash不支持浮点数据,除非借助于外在工具。并且bash中的变量无需事先声明。相当于把声明和赋值过程同时实现。

            申明:类型,变量名

      6、变量替换:把变量名出现的位置替换为其所指向的内存空间中的数据。

      7、变量引用:${var_name},$var_name

      9、变量名:字母数字下划线组成的字符串,并且不能以数字开头。这个法则对所有的编程语言几乎都是一样的。

        变量名:见名知意,命名机制遵循某种法则。并且不能够使用程序的保留字,例如if,else,then,while等等

      10、bash变量类型

    [root@node1 ~]# pstree
    systemd─┬─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─abrt-watch-log
            ├─abrtd
            ├─agetty
            ├─atd
            ├─auditd───{auditd}
            ├─crond
            ├─dbus-daemon
            ├─dockerd─┬─docker-containe───8*[{docker-containe}]
            │         └─8*[{dockerd}]
            ├─irqbalance
            ├─lsmd
            ├─lvmetad
            ├─master─┬─pickup
            │        └─qmgr
            ├─polkitd───5*[{polkitd}]
            ├─rngd
            ├─rsyslogd───2*[{rsyslogd}]
            ├─smartd
            ├─sshd─┬─sshd───bash───su───bash
            │      ├─sshd───bash
            │      └─sshd───bash───pstree #我们pstree运行的位置
            ├─systemd-journal
            ├─systemd-logind
            ├─systemd-udevd
            ├─tuned───4*[{tuned}]
            └─vmtoolsd───{vmtoolsd}

        a、本地变量:作用域仅是当前shell进程

          变量赋值:name=value

          变量引用:${name},$name

            "":变量名会替换为其值

            '':变量名不会替换为其值

          查看变量: set命令

          撤销变量:unset name

            注意:此处非变量引用

    [root@node1 ~]# first_name=wohaoshuai
    [root@node1 ~]# echo ${first_name}
    wohaoshuai
    [root@node1 ~]# unset first_name
    [root@node1 ~]# echo ${first_name}

        b、环境变量:作用域是当前shell进程及其子进程

          变量赋值:

            (1)、export name=value

            (2)、name=value

                export name (这样对子shell就有效了)

            (3)、declare -x name=value

            (4)、name=value

                declare -x name(这样也对子shell就有效了)

          变量引用:${name},$name

          注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境。

            PATH,HISTFILE,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD

          查看环境变量:export,declare -x,printenv,env

          撤销环境变量:unset name

        c、只读变量:只读变量无法重新赋值,并且不支持撤销,存活时间为当前shell进程的生命周期,随shell进程终止而终止。

          (1)、readonly name

          (2)、declare -r name

    [root@node1 ~]# firstname=wohaoshuai
    [root@node1 ~]# echo ${firstname}
    wohaoshuai
    [root@node1 ~]# readonly firstname
    [root@node1 ~]# firstname=wohaoshuai2
    -bash: firstname: readonly variable
    [root@node1 ~]# unset firstname 
    -bash: unset: firstname: cannot unset: readonly variable

        d、局部变量:当前shell进程中的某一个代码片段作用域(函数上下文)

        e、位置参数变量:向执行脚本的shell进程传递的参数

        f、特殊变量:通常是shell内置的有特殊功用的变量

          $?:

            0:成功

            1-255:失败

    四、bash特性之多命令执行:

      1、COMMAND1;COMMAND2;COMMAND3;  :即执行完了第一个然后执行第二个,然后执行第三个...

      2、逻辑运算:

        运算数:真(true,yes,on,1)

            假(false,no,off,0)

        与:全真则真,一假全假

          1 && 1 = 1

          1 && 0 = 0

          0 && 1 = 0

          0 && 0 = 0

        或:

          1 || 0 = 1

          1 || 1 = 1

          0 || 1 = 1

          0 || 0 = 0

        非:

          ! 1 = 0

          ! 0 = 1

        异或:

        a、短路法则:前一个命令失败了后一个命令就不会执行,前一个命令成功了后一个命令才执行。

          COMMAND1 && COMMAND2 

    [root@node1 ~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc
    [root@node1 ~]# touchabc /tmp/test.etc && ls /etc/ > /tmp/test.etc2
    -bash: touchabc: command not found
    [root@node1 ~]# cat /tmp/test.etc2
    cat: /tmp/test.etc2: No such file or directory

        b、如果前一个命令成功了后一个命令不运行,前一个命令失败了后一个命令才运行

          COMMAND1 || COMMAND2

    [root@node1 ~]# id user1
    id: user1: no such user
    [root@node1 ~]# id user1 || useradd user1
    id: user1: no such user
    [root@node1 ~]# id user1
    uid=5010(user1) gid=5011(user1) groups=5011(user1)
  • 相关阅读:
    Java集合:HashMap
    Java线程池原理
    Linux常用命令
    分布式系统基本概念
    接口中的default方法(默认方法)
    正则表达式匹配+过滤
    Java Optional类
    mongo过期索引
    Java8函数式接口简介
    JS版微信6.0分享接口用法分析
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12076444.html
Copyright © 2020-2023  润新知