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