一)bash的基础特性
1)命令历史
命令:history
环境变量:
* [root@fenfa ~]# echo $HISTSIZE 默认情况,命令历史记录的条数
1000
* [root@fenfa ~]# echo $HISTFILE 每一个用户都有一个独立的命令历史文件,该文件在用户的家目录下以.bash_history
/root/.bash_history
* [root@fenfa ~]# history -d 751 删除某一条命令历史
* [root@fenfa ~]# history -c 清空命令历史
* [root@fenfa ~]# history # 显示历史中最近的#条记录
* [root@fenfa ~]# history
1 cd /etc/profile.d/
2 ll
3 vim history.sh
[root@fenfa ~]# !1 通过!# 执行某一条命令
cd /etc/profile.d/
[root@fenfa profile.d]# !! 通过!! 指定上一条命令
cd /etc/profile.d/
[root@fenfa ~]# ls -l !$ 通过!$调用上一个命令的参数
ls -l /etc/fstab
-rw-r--r--. 1 root root 779 Aug 14 11:25 /etc/fstab
* 详细记录history
[root@fenfa profile.d]# cat history.sh
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
export HISTTIMEFORMAT="[%F %T][`whoami`][${USER_IP}] "
You have mail in /var/spool/mail/root
[root@fenfa profile.d]# source history.sh
查看
[root@fenfa ~]# history
1 [2018-01-08 11:18:16][root][10.2.18.231] history
* 运行命令不记录到history
通过环境变量HISTCONTROL
ignoredups 忽略重复的命令
ignorespace 忽略空白开头的命令
ignoreboth 以上2中都生效
[root@fenfa ~]# echo $HISTCONTROL
ignoredups 默认为忽略重复的命令(该命令为连续且重复的,只会记录一条)
[root@fenfa ~]# export HISTCONTROL=ignorespace 或者
[root@fenfa ~]# export HISTCONTROL=ignoreboth
[root@fenfa ~]# history -c
[root@fenfa ~]# ls -l /root/
total 80
-rw-------. 1 root root 1127 Aug 14 11:27 anaconda-ks.cfg
[root@fenfa ~]# history
1 [2018-01-08 11:35:44][root][10.2.18.231] history
发现以空格开头的命令没有记录到history中
注意:以上修改只对当前shell及子shell有效
针对所有用户都生效,修改/etc/profile目录
if [ "$HISTCONTROL" = "ignoredups" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignorespace
fi
2)命令补全
案例:比如执行clear命令
bash会根据path环境变量中设置好路径,从左往右依次查找,与命令cle开头的文件名,当找到了,而且这个是唯一的,就可以按table键,直接补全。如果不唯一,连续按2次table键,就会以列表的形式显示出来
案例:比如执行pwd命令,当你输入pw连续按2次table键,如下
[root@fenfa tmp]# pw
pwck pwconv pwd pwdx pwunconv
3)路径补全
把用户给出的字符串当作路径开头,并在指定上级目录下搜索以指定的字符串开头的文件名,如果唯一,则直接补全,如果不唯一,再次按tab,显示出列表
4)命令行展开
~ 展开用户的主目录
~username 展开指定目录的家目录
{} 可承载一个以逗号分隔的路径列表,并将其展开为多个路径
[root@fenfa tmp]# mkdir -p /tmp/x/{y1,y2}/{a,b}
[root@fenfa tmp]# mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}
[root@fenfa tmp]# tree /tmp/
/tmp/
├── bin
├── sbin
├── usr
│ ├── bin
│ └── sbin
5)命令的执行状态结果
成功 0
失败 1-255
bash内部用一个特殊变量$?保存上一个命令(最近一个)的执行结果,其中0表示执行,1-255都表示执行失败
[root@fenfa tmp]# mkdir /tmp/test2
[root@fenfa tmp]# echo $?
0 --------成功
[root@fenfa tmp]# mkdir /tmp/test2
mkdir: cannot create directory `/tmp/test2': File exists
[root@fenfa tmp]# echo $?
1----------失败
[root@fenfa tmp]# mkddir /tmp/test2
-bash: mkddir: command not found
[root@fenfa tmp]# echo $?
127---------失败
5)命令别名
通过alias设置
[root@fenfa ~]# echo "alias cdnet='cd /etc/sysconfig/network-scripts/'" >> /etc/bashrc
You have mail in /var/spool/mail/root
[root@fenfa ~]# source /etc/bashrc
[root@fenfa ~]# alias ----显示当前shell进程下所有的alias别名
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
6)bash的快捷键
ctrl+a 回到行首
ctrl+e 回到尾部
ctrl+k 删除光标所在到命令行尾部的所有内容
ctrl+u 删除光标所在到命令行首部的所有内容
7)bash的IO重定向及管道
读入数据: input
输出数据: output
一个程序要读入数据,需要考虑这个程序是从哪里读入数据呢?
标准输入: 键盘输入,0
标准输出: 显示器,1
标准错误输出: 显示器,2
输出重定向: COMMAND > file 覆盖重定向
COMMAND >> file 追加重定向
2> 覆盖重定向的错误数据流
2>> 追加重定向错误数据流
标准输出和错误输出各自定向到不同位置:
command >> /path/to/file.out 2>> /path/to/error.out
[root@fenfa tmp]# ls /etc/ > a.out
[root@fenfa tmp]# set -C------》禁止将内容覆盖输出到已有文件中
You have mail in /var/spool/mail/root
[root@fenfa tmp]# ls /etc/ > a.out
-bash: a.out: cannot overwrite existing file
[root@fenfa tmp]# tail -100 /etc/rc.d/rc.sysinit > /tmp/sysinit.out 2> /tmp/sysinit.error
You have mail in /var/spool/mail/root
[root@fenfa tmp]# cat /tmp/sysinit.out
# Reread in network configuration data.
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
此处生成文档
[root@fenfa tmp]# cat <<EOF
> 1、install http server
> 2、install php server
> 3、install mysql server
> EOF
1、install http server
2、install php server
3、install mysql server
You have mail in /var/spool/mail/root
[root@fenfa tmp]# cat >> /tmp/test.out <<EOF
1、install http server
2、install php server
3、install mysql server
EOF
管道:
第一个命令的输出结果当第二个命令的输入
[root@fenfa tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@fenfa tmp]# echo $PATH | tr 'a-z' 'A-Z'
/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
二)glob 文件名通配符
功能:bash中用于实现文件名通配的机制
通配符:
* 任意长度任意字符
? 任意单个字符
【】
a*b 以a开头,b结尾,中间可以跟0个或任意多个字符
[root@fenfa glob]# touch ab aab a12b abc a@b aMb
[root@fenfa glob]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 8 14:51 a12b
-rw-r--r-- 1 root root 0 Jan 8 14:51 aab
-rw-r--r-- 1 root root 0 Jan 8 14:51 ab
-rw-r--r-- 1 root root 0 Jan 8 14:51 abc
-rw-r--r-- 1 root root 0 Jan 8 14:51 a@b
-rw-r--r-- 1 root root 0 Jan 8 14:51 aMb
[root@fenfa glob]# ls a*b
a12b aab ab
[root@fenfa glob]# ls a?b
aab
[root@fenfa glob]# ls a[0-9]b
a2b
[root@fenfa glob]# ls a[a-z]b
aab aMb-----------(不区分字符的大小写)
[root@fenfa glob]# ls a[A-Z]b
aMb
[root@fenfa glob]# ls a[^0-9a-z]b
a@b
[root@fenfa glob]# ls a[^[:alnum:]]b
a@b
专用字符集合
【:digit:】相当于0-9
【:alnum:】相当于a-z A-Z 0-9
【:alpha:】 相当于a-z A-Z
【:space:】相当于空格字符
【:punct:】相当于所有标点符号
三)Bash的配置文件
按其生效范围划分,存在以下两类
全局配置:/etc/profile /etc/bashrc /etc/profile.d/*.sh
个人配置: ~/.bash_profile ~/.bashrc
shell登录:
交互式登录:
直接通过终端登录 或者通过su - username
/etc/profile-----/etc/profile.d/*.sh----~/.bash_profile--->~/.bashrc--->/etc/bashrc
非交互式登录:
su username
图形界面下打开的为终端
执行脚本
~/.bashrc--->/etc/bashrc---->/etc/profile.d/*.sh
profile类公用:
1)用于定义环境变量
2)用于运行命令或脚本
全局:
/etc/profile
/etc/profile.d/*.sh
个人:
~/.bash_profile
bashrc类公用:
1)定义命令别名
2)定义本地变量
全局:
/etc/bashrc
个人
~/.bashrc
四)在bash中如何进行算术运算