Bash

1、bash的基础特性

   (1) 命令历史

     bash会记录此前用户在shell会话中执行的命令于缓冲区中;正常退出时,会被记录于当前用户家目录下隐藏文件.bash_history中;

     环境变量:

       HISTSIZE:命令历史记录的条数;

       HISTFILE:命令历史文件路径;

       HISTFILESIZE:

     history命令:

       -c:清空命令历史;

       -d #: 删除历史中指定的命令;

       -a: 当缓冲区中的历史手动追加文件;

       history #: 显示最近的多少条命令;


     调用过去执行过的命令:

       !#:调用历史中的第#条命令;

       !!: 重复执行上一条命令

       !string:调用历史中最近一个以string开头的命令;


     调用过去执行过的命令的最后一个参数:

       !$:

       ESC, .

       Alt+.


   (2) 命令补全

     bash内建命令

       外部命令

       命令搜索机制:

       PATH环境变量:由冒号分隔的路径


     hash:把此前搜索到路径缓存到内存中;

       kv: key-value

       ls --> /bin/ls



   (3) 路径补全

     把用户给出的路径字符串当前路径起始,并在其指定的上级目录下搜索以指定的字符串开头的文件名;

     如果惟一:直接补全;

     否则:两次Tab,可列出;


   (4) 命令行展开的功能

     ~: 展开为当前用户的主目录;

     ~USERNAME:展开为指定用户的家目录;

     {}:可承载一个以逗号分隔的列表,并其展开为多个路径;

     /var/{log,cache,run} = /var/log /var/cache /var/run


   (5) 命令的执行结果状态,由bash追踪和保存

     成功:0

     失败:1-255


       bash使用特殊变量$?保存最近一条命令的状态结果;

       程序的执行结果有两种:

       程序的返回值;

       程序的状态结果;


   (6) 命令别名

     命令的另一个引用符号,由bash程序维护;

     alias/unalias

       alias: 查看所有已经定义别名;

       alias NAME=COMMAND:定义别名;

     如果别名同原命令名,想直接执行原命令,则需使用\COMMAND

       unalias NAME: 撤消别名;


2、bash的基础特性

   (1) glob

     文本名“通配”

       *:匹配任意长度的任意字符;

       ?:匹配任意单个字符;

       a*b: aab, ab, a123b; 

       a?b: 

       []: 匹配指定范围内的任意单个字符;

       [0-9]

       [^]:匹配范围外的任意单个字符;

       [^a-b]


     字符集合:

       [:lower:]

       [:upper:]

       [:alnum:]

       [:digit:]

       [:space:]

       [:punct:]

       [:alnum:]


     Ctrl+l:清屏

     Ctrl+a: 切换至命令行首

     Ctrl+e:切换至命令行尾

     Ctrl+c:取消命令执行

     Ctrl+u:删除光标所在处至行首的内容;

     Ctrl+k: 删除光标所在处至行尾的内容;


3、bash环境配置

(1)配置文件,生效范围划分,存在两类:

   全局配置:

     /etc/profile, /etc/profile.d/*.sh

     /etc/bashrc

   个人配置:

     ~/.bash_profile

     ~/.bashrc


(2)按功能划分,存在两类:

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

     /etc/profile, /etc/profile.d/*.sh

    ~/.bash_profile

    做用:

       定义环境变量,例如PATH、PS1

      运行命令或脚本


(3)bashrc类:为非交互式登录shell提供配置

   /etc/bashrc

   ~/.bashrc

     做用:

       (1) 定义命令别名;

       (2) 定义本地变量;


(4)变量:内存空间,变量名

   类型:

     环境变量:作用范围当前shell进程及其子进程

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

     局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)

     位置变量:$1, $2

     特殊变量:$?


(5)变量定义方式:

   bash内置变量:可直接调用,内置了许多环境变量,例如PATH等

     自定义变量:name=value

     变量赋值:变量名=值


(6)bash弱类型:

   变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用;

     120:24bits

     120: 8bits 


(7)定义环境变量:

   export name=value

   declare -x name=value


查看:env, printenv, export,set


(8)撤消变量:

   unset name


(9)引用变量:

   ${name}, $name


例子:

[root@localhost /]# animal='dog'
[root@localhost /]# echo "There are some $animals."
There are some .
[root@localhost /]# echo "There are some ${animal}s."
There are some dogs.


(10)bash中的引用符号:

   '': 强引用,变量替换不会发生

   "":弱引用

   ``: 命令引用


例子:

[root@localhost /]# ls -l `which cat`
-rwsr-xr-x. 1 root root 48568 10月 15 2014 /bin/cat
[root@localhost /]# echo "$animal"
dog
[root@localhost /]# echo '$animal'
$animal


(11)常用的环境变量 

   PATH 决定了shell将到哪些目录中寻找命令或程序 

   HOME 当前用户主目录 

   HISTSIZE 历史记录数 

   LOGNAME 当前用户的登录名 

   HOSTNAME 指主机的名称 

   SHELL 当前用户Shell类型 

   LANGUGE  语言相关的环境变量,多语言可以修改此环境变量 

   MAIL 当前用户的邮件存放目录 

   PS1 基本提示符,对于root用户是#,对于普通用户是$


(12)Linux的变量种类 

   按变量的生存周期来划分,Linux变量可分为两类: 

     1. 永久的:需要修改配置文件,变量永久生效。 

     2. 临时的:使用export命令声明即可,变量在关闭shell时失效。 


(13)shell登录类型:

   交互式登录:

   直接通过终端进行的登录;

   通过su -l Username命令实现的用户切换;


(14)非交互式登录:

   图形界面下打开的命令行窗口;

   执行脚本;

   su Username;


(15)配置文件作用次序:

   交互式登录:

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


(16)非交互式登录:

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


(17)编辑配置文件定义的新配置如何生效?

   重新登录;

   让当前shell进程去重新读取指定的配置文件;

     source /PATH/TO/SOMEFILE

     . /PATH/TO/SOMEFILE

注意:副作用


问题:

1、定义对所有用都生效的别名?

答:echo "alias cdnet='cd /etc/sysconfig'" >> /etc/bashrc


2、如果仅需要PATH环境变量的修改仅对root用户生效,该如何操作?

答:sed -i '10s/$/:\/usr\/local\/apache2\/bin/' ./.bash_profile