bash的特性及配置文件

                bash的基础特性

命令行展开 ~ {}     

命令别名 alias   unalias

命令历史  history    

命令补全  当用户输入命令敲tab键的时候 系统会去查找 $PATH中指明路径下自左而右的查找命令

文件名通配   glob

路径补全

快捷键

ctrl +a 跳转到行首

e 跳转到行尾

u 删除行首到光标之间的内容

K 删除行尾到光标的内容

l 同 clear   

d 同 exit

 

              bash特性之: 命令hash

缓存此前命令的查找结果

每当用户使用命令时bash会去找hash中缓存的命令 如果没有再去$PATH中去找命令 这样可以大幅加快命令的查找速度

可以使用hash命令查看本次shell缓存的命令

[root@yangyang ~]# hash

命中 命令

   2 /usr/bin/cat

   1 /usr/bin/ls

   1 /usr/bin/su

[root@yangyang ~]# hash -d cat  Hash -d 命令 删除-d后面命令的缓存

[root@yangyang ~]# hash

命中 命令

   1 /usr/bin/ls

   1 /usr/bin/su

[root@yangyang ~]#

 

[root@yangyang ~]# hash -r Hash -r 清空hash表

[root@yangyang ~]# hash

hash: 哈希表为空

 

        bash特性之: 变量

 

变量=变量名+指向的内存空间

变量赋值:把我们要存储的数据存储到变量名指定的内存空间

对于shell来说 变量赋值的机制就是 name=value

 

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

比如说字符串123 和 45 相加等于12345

如果是数值 123 和 45 那就是168了

编程语言又可以分为

强类型变量语言  存储的变量是那种类型参与运算时就一定要是那种类型不能有违反规则的地方 比如c语言

弱类型变量语言  比如 bash把所有变量统统视作字符型 要进行数值计算时他会自动转化为数值型,bash不支持浮点数据除非借助外在工具  而且 Bash 的变量无需事先声明

 

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

也就是变量引用  ${name}      $name

变量名的规范

硬规范 只能包含 数字 字母 和下划线 且不能以数字开头 还不能使用系统的保留字(if then while 等)

软规范:见名知意 很重要

 

 

         Bash的变量类型

本地变量: 作用域仅为当前shell

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

局部变量:作用域仅为代码片段(函数中声明的变量)

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

特殊变量 :系统内置的变量 如  $? $*  $#  $@ 等

 

本地变量

变量赋值: name=value

变量引用:${name}  $name

“$name” : 弱引用变量名会替换为其值

‘$name’  : 强引用变量名不会替换为其值

查看变量 set

撤销变量 unset NAME

 本地变量对同级和子级shell是无效的 只对当前sehl有效

 

 

环境变量

变量赋值 export name=value

    declare -x name=value

注意bash内嵌的许多环境变量 通常为全大写一般用于定义bash的工作环境

 如 PATH HISTFILE HISTSIZE HISTFILESIZE PWD HOME 等

 环境变量对当前shell和子进程是有效的

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

撤销环境变量 也是 unset NAME

设置只读变量 declare -r NAME 

只读变量无法重新赋值 而且不能撤销

        Bash特性之多命令执行

无逻辑

命令 中间用;隔开   

如 : 命令;命令;命令;命令

命令和命令没有逻辑关系 执行上一个下一个就会执行

运算逻辑 

命令 && 命令

第一个命令执行成功 第二个命令才会执行

第二个命令执行失败 第二个命令会直接跳过

  命令 || 命令

第一个命令执行成功 第二个命令直接跳过

第一个命令执行失败 第二个命令才会执行

 

#上述两个也就是所谓的短路法则

 

  If [  !  -n  $name  ]

判断name的值是否为空

 -n  是否为非空字符串 只要字符串非空,就是成立 加上!就会是空字符则成立

 

 

 

            Shell脚本

编程语言的分类

编译运行 源代码 > 编译器 > 程序文件

解释运行 源代码 > 运行时启动解释器,由解释器边解释边运行

 

 编辑模型  :  程序=指令+数据

 面向过程的语言

 过程式编程:以指令为中心来组织代码,数据服务与代码         举例:C语言  bash语言

 面向对象的语言

 对象式编程 :以数据为中心组织代码,围绕数据来组织指令

首先编写很多类(class)代码,每一个类中所包含数据结构或者说是实例化对象 ,然后对数据(对象)施行操作

举例:java  C++  Python(其实c++ 和PY都支持,不是完全面向对象的,但是JAVA是完全面向对象的)

 

 

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

 Shell脚本是什么?其实就是命令的堆积,但是许多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,

以避免运行出现错误

 

          如何写shell脚本

脚本中第一行顶格 给出shebang 也就是解释器路径,常见的解释器 #!/bin/bash  #!/usr/bin/python 然后就是命令的堆积去实现某种功能

为什么文本文件可以执行呢就是因为内核会判断文件的前几个字节也就是shebang

然后用对应的shebang去解释运行下面的代码

这种机制下是直接运行文本文件然后内核去找shebang,也可以直接定义解释器

这就是两种shell脚本的运行方式      ./1.sh 或直接指定解释器 bash 1.sh

 

注意:1 脚本中除了shebang 余下所有#开头的行都会被注释而忽略

      2 shell脚本运行是通过运行一个子shell进程实现的

 

          Bash的配置文件

有两类

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

bashrc类 : 为非交互式登录的shell提供配置 (其实bashrc交互式也会读取)

对于profile类分为

全局配置 /etc/profile 和 /etc/profile.d/*.sh

用户配置 ~/.bash_profile

功能

1,用于定义环境变量

2,运行命令或脚本

bashrc类分为

全局 /etc/bashrc

用户 ~/.bashrc

功用

1用于定义本地变量

2 定义命令别名

登录类型

交互式登录

  直接通过终端输入账户和密码后登录的shell进程

  和使用  su - USER 或者 su -l USER 执行的登录切换

非交互式登录

su NAME 不加 - 就是非交互式登录

图形化页面打开终端

运行脚本 

 

配置文件的读取次序

对于交互式登录来说

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

对于非交互登录

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

 

让配置文件立即生效

 Source 配置文件

 ./配置文件

原文地址:https://www.cnblogs.com/linuxys/p/13037332.html