bash脚本基础2

bash脚本基础

bash特性:

  命令行展开: ~, {}

  命令别名: alias , unalias

  命令历史:  history

  文件名通配: glob

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

  命令补全: $PATH

  路径补全

bash特性之:  命令hash

  记住外部命令的位置

  缓存此前的命令查找结果:  key-value形式存储的.

    hash  -d  COMMAND: 删除指定命令

    hash  -r:  清除hash表

[root@localhost ~]# hash
hits    command
   1    /usr/sbin/service
   1    /usr/bin/vim
   2    /usr/bin/ping
[root@localhost ~]# type hash
hash is a shell builtin

bash特性之:  变量

  程序: 指令+数据组成

    指令: 由程序文件提供

    数据: 可以通过标准输入获取(IO设备),  文件,  管道(类文件), 变量

  程序: 算法+数据结构

  变量名:  指向内存空间(命名的内存)

  变量赋值:  name=value

  变量类型: 存储格式, 数据类型

    编程语言:

      强类型语言

      弱类型语言:

        bash把所有变量视作字符类型

        bash中的变量无需事先声明      

    变量替换:  把变量名出线的位置替换为其内存空间所指向的数据

    变量引用:  $(var_name), $var_name

    变量名:  只能数字, 字母, 下划线,  不能以数字开头

      变量名:  见名知意,  同一用某种法则

    bash变量类型:

      本地变量:  作用域范围仅为当前shell进程

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

      局部变量:  作用域仅为某代码片段(函数的上下文)

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

      特殊变量:  shell内置的有特殊功能的变量

        eg:        

        $?:  表示上一个命令的执行结果

          0: 成功

          1-255:  失败

      

      本地变量:

        变量赋值:  name=value

        变量引用: $(name), $name

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

          '':  强引用, 不会替换其值

        查看变量:  set

        撤销变量:  unset  name 不要$

      环境变量:

        变量赋值: 

          (1):  export name=value

          (2):  name=value

             export name

          (3):  declare -x name=value   

          (4):  name=value

            declare -x name

        不要与bash自带的关键环境变量(用于定义bash的工作环境)重名:

          PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTRAL, SHELL, HOME, UID, PWD...

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

        撤销环境变量:  unset  name

      只读变量(常量):

        declare -r  name

        readonly  $name

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

 

bash特性之多命令执行:

  COMMAND1; COMMAND2; COMMAND3...  以分号分隔

  逻辑运算:

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

        假(false, no, off, 0)

    逻辑运算符:

      与,  或,  非,  异或

      &&,  ||,  !,  ^

  短路法则: 

    COMMAND1  && COMMAND2,  只有前一个命令成功之后,  才会执行后一个命令

    COMMAND1  ||  COMMAND2,  只有第一个命令为"假",  才会执行后一个命令

      如果用户不存在, 则创建用户

[root@localhost ~]# id user1 || useradd user1
id: user1: no such user

 

shell 脚本编程: 

  过程式编程,  解释运行,  依赖于外部程序文件运行

  如何写shell脚本?

    脚本文件的第一行,  顶格: 给出shebang,  解释器路径, 用于指明解释执行当前脚本的解释器程序文件.

      常见的解释器:

        #!/bin/bash

        #!/user/bin/python

        #!/usr/bin/perl

  shell脚本是什么?

    命令的堆砌

    许多的命令都不具有幂等性(即可以重复的运行),  所以需要添加判断, 来防止程序出错.

  bash的配置文件:

    两类:

      profile类:  为交互式登录的shell进程提供配置

      bashrc类:  为非交互式登录的shell进程提供配置
    登录类型:

      交互式登录shell进程:

        直接通过某终端输入账号和密码登录打开的shell进程

        使用su命令: su - USERNAME, 或者使用 su - USERNAME 执行的登录切换功能

      非交互式登录的shell进程 :

        su USERNAME

        图形界面下打开的终端

        运行脚本(shell脚本是在一个子shell进程运行实现的)

    profile类:

      全局:  对所有用户都生效:

        /etc/profile

        /etc/profile.d/*.sh

      用户个人:  仅对当前用户有效

        ~/.bash_profile

      功用:

        1.  用于环境变量

        2.  运行命令或脚本

    bashrc类:

      全局:  

        /etc/bashrc

      用户个人:

        ~/.bashrc

      功用:

        1.  定义本地变量

        2. 定义命令别名

    注意:  仅管理员可修改全局配置文件

    读取顺序:

      交互式登录shell进程:

        /etc/profile  --> /etc/profile.d/*  -->  ~/.bash_profile  --> ~/.bashrc  --> /etc/bashrc

      非交互式登录shell进程:

        ~/.bashrc  --> /etc/bashrc  --> /etc/profile.d/*

    命令行的定义的特性,  例如变量和别名作用域为当前shell进程 的生命周期

    配置文件定义的特性,  只对随后新启动的shell进程有效

    让通过配置文件定义的特性立即生效:

      (1):  通过命令行重复定义一次

      (2):  让shell进程重读配置文件

        source /PATH/CONF_FILE

        .  /PATH/CONF_FILE

 

bash算数运算

  + -  * /  **  %

  算数运算符格式:

    (1) let  var=算数运算符表达式

    (2) var=$(算数运算符表达式)

    (3)  var=$((算数运算符表达式))

    (4)  var=$(expr $ARG1 $OP $ARG2)    

[root@localhost ~]# declare -i n2=5
[root@localhost ~]# declare -i n1=4
[root@localhost ~]# let res=$n1+$n2
[root@localhost ~]# echo res
res
[root@localhost ~]# echo $res
9
[root@localhost ~]# echo $[$n1+$n2]
9
[root@localhost ~]# echo $(($n1+$n2))
9   
[root@localhost ~]# echo $(expr $n1 + $n2)
9

 

posted @ 2019-08-16 06:32  yscl  阅读(75)  评论(0)    收藏  举报