ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
一)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中如何进行算术运算